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

C++ how to check a condition before using initialiser 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)) { }

然后我在另一个 class 中使用这个字段,例如:

//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)
*/

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

如果有其他方法,我将不胜感激任何类型的解决方案。

不应该使用 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))
{ }

有几种方法可以解决这个问题。首先,您可以只使用 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)) {}

如果您不喜欢初始化列表中的代码,那么您可以将其放入私有静态函数中并调用该函数。

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

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) {}

    // ...
};

也可以在构造函数体中使用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);
    }
}