C ++在使用初始化列表之前如何检查条件?

时间:2019-05-31 16:48:14

标签: c++ initializer-list

我正在写一段这样构成的代码:

//field.h
class Field {
    std::vector<std::vector<double>> data;

    public:
    Field(int, int);        
};
Field::Field (int dim0, int dim1) :: data(dim0, std::vector<double>(dim1, 0)) { }

然后我在另一个类中使用此Field:

//approx.h
class Field;
class Approx {
    Field SWAP;

    public:
    Approx(int, int);
};
Approx::Approx (int size, int dim) { }
/*I want to initialise SWAP like this:
     if (size > dim) SWAP(size, dim)
     else SWAP(dim, size)
*/

我不知道该怎么做。我想没有初始化列表是不可能的吗?我什至可以在初始化程序列表中问这些问题吗?

如果还有其他方法可以解决,我将不胜感激。

4 个答案:

答案 0 :(得分:3)

不应该使用std :: min和max做这招吗?

class Field;
class Approx {
Field SWAP;

public:
Approx(int, int);
};
Approx::Approx (int size, int dim): SWAP(std::max(size,dim), std::min(size,dim))
{ }

答案 1 :(得分:3)

有两种方法可以解决此问题。首先,您可以只使用std::minstd::max来获取正确的值,例如

Approx::Approx (int size, int dim) : SWAP(std::max(dim, size), std::min(dim, size)) {}

第二,您可以编写一个lambda并像这样立即调用它

Approx::Approx (int size, int dim) : SWAP([](auto size, auto dim){ if (size > dim) return Field(size, dim); else return Field(dim, size); }(size, dim)) {}

如果您不喜欢将代码包含在初始化列表中,则可以将其放入私有静态函数中,然后调用该函数。

答案 2 :(得分:1)

使用委托构造函数的另一种方法:

class Approx
{
private:
    Field SWAP;

private:
    explicit Approx(std::pair<const int&, const int&> p) : SWAP(p.second, p.first) {}

public:
    Approx(int size, int dim) : Approx(std::minmax(size, dim) {}

    // ...
};

答案 3 :(得分:-2)

您还可以使用std::unique_ptr初始化构造函数主体中的成员变量,例如:

class Approx {
    std::unique_ptr<Field> SWAP {nullptr};

public:
    Approx(int, int);
};

Approx::Approx (int size, int dim) {
    if (size > dim) {
        SWAP = std::make_unique<Field>(size, dim);
    } else {
        SWAP = std::make_unique<Field>(dim, size);
    }
}