我有一个结构,我想像这样初始化:
checkPoints someCheckpoints = {
{
mPosition(10, 18),
mPosition(15, 20),
},
{
mPosition(45, 80),
mPosition(95, 105),
}
};
基本上是使用聚合器初始化位置 vector 的 vector 。
这工作正常:
std::vector<PosVec> someCheckpoints = {
{
mPosition(10, 18),
mPosition(15, 20),
},
{
mPosition(45, 80),
mPosition(95, 105),
}
};
但是我需要使用结构来添加一些附加功能。
我的代码:
struct mPosition {
mPosition(int32_t x, int32_t y) : x(x), y(y) {}
int32_t x;
int32_t y;
};
typedef std::vector<mPosition> PosVec;
struct checkPoints {
explicit checkPoints(std::vector<PosVec>& checkPoints) {
checkPointsVec = checkPoints;
};
const PosVec& getRandom() const {
return checkPointsVec[getRandomInt(0, checkPointsVec.size())];
}
std::vector<PosVec> checkPointsVec;
};
checkPoints someCheckpoints = { // no matching constructor
{
mPosition(10, 18),
mPosition(15, 20),
},
{
mPosition(45, 80),
mPosition(95, 105),
}
};
这会产生没有匹配的构造函数
错误。我希望它使用适当的类似 vector 的聚合构造函数。我的结构应该扩展 vector 类吗
或者我可以声明我自己的构造函数(哪一个)来做到这一点?
我该如何解决这个问题?
最佳答案
std::vector
不用大括号表示。在初始化中使用时,您使用的是 std::initializer_list
。而 const
正在发挥作用。所以我想写
explicit checkPoints(const std::initializer_list<PosVec>& checkPoints)
^~~~~ ^~~~~~~~~~~~~~~~
通过这种方式,你的构造函数可以捕获文字常量。
此外,如Jarod42 noted in comments ,不能像 checkPoints a = {};
那样调用显式
构造函数。你只能这样调用它
checkPoints a { /* stuff */ };
checkPoints a ( /* stuff */ };
请注意,您在这里使用了右值初始化,因此它不会被非常量左值引用捕获。它只能由右值引用或 const 左值引用捕获。
checkPoints someCheckpoints = {
{
mPosition(10, 18),
mPosition(15, 20),
},
{
mPosition(45, 80),
mPosition(95, 105),
}
}; // This is an rvalue!
无论如何,如果不修改其中的引用,将参数声明为 const 是一个很好的做法。
关于c++ - 如何聚合初始化这个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361479/