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::min
和 std::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);
}
}
我正在写一段这样结构的代码:
//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::min
和 std::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);
}
}