c++ - 如何聚合初始化这个结构?

标签 c++ c++11 vector struct

我有一个结构,我想像这样初始化:

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/

相关文章:

c++ - std::move 对于不同长度的 std::string 的性能问题

algorithm - 为查询索引 Haskell 数据结构

java - "unchecked conversion"通过 vector

c++ - QT4:如何重启应用程序?重新设置?

c++ - 为什么元组有 uses_allocator 而对却没有?

c++ - 已删除 "general"案例的专用模板函数无法使用 g++ <=4.8.0 和 clang++ 编译

c++ - 如何访问 std::vector 迭代器中的 std::map 属性?

c++ - Visual C++ 非托管代码 : Use/EHa or/EHsc for C++ exceptions?

c++ - 将 std::find_if() 与采用多个输入参数的比较函数一起使用

c++ - 无法让 getch 和 Switch Case 在 C++ 中协同工作