【问题标题】:c++ std::intializer_list and constructorc++ std::initializer_list 和构造函数
【发布时间】:2020-10-05 13:58:35
【问题描述】:

我正在尝试创建一个适用于“组”向量的函数。

让组命名为ABC,...可以有任意数量的组。每个组都有一个“主要”向量,例如。 v_A 类型为 int 和可变数量的关联向量,例如。 v_A1, v_A2, ... 都是 float 类型。

我希望创建一个函数groupwise,它可以采用可变数量的组,每个组具有可变数量的元素,如下所示。

#include <vector>
using std::vector;

struct group_t {
    vector<int> x;
    vector<vector<float>> vv;
    group_t(vector<int> x, std::initializer_list<vector<float>> lv) : x(x) { // constructor
        for (auto v : lv) {
            vv.push_back(v);
        }
    }
};

void groupwise(std::initializer_list<group_t> listofgroups) {}

int main() {
    vector<int> v_A, v_B, v_C;
    vector<float> v_A1, v_A2, v_B1, v_B2, v_B3, v_C1;

    groupwise( // No matching function for call to 'groupwise'
        { v_A, { v_A1, v_A2 } },
        { v_B, { v_B1, v_B2, v_B3} },
        { v_C, { v_C1 } }
    );
}

我在这里的嵌套初始化列表的想法(如果这是我所做的?...)不起作用。 No matching function for call to groupwise 是我得到的编译器错误。

如何实现一个正确声明的函数groupwise,可以用最简单的方式调用?如果可能的话,我想避免在调用groupwise 之前明确地构造每组向量,并且宁愿在调用groupwise 时自动处理这些问题(正如我在这里通过group_t 的构造函数所打算的那样) .

谢谢!

【问题讨论】:

    标签: c++ constructor parameter-passing


    【解决方案1】:

    你只需要在函数调用中使用另一对大括号来指示最外层的initializer_list,如下所示:

    groupwise({   // here
        { v_A, { v_A1, v_A2 } },
        { v_B, { v_B1, v_B2, v_B3} },
        { v_C, { v_C1 } }
    });  // and here
    

    这是demo

    【讨论】:

    • 没问题 :) 很快你就会习惯这些事情并且能够自己发现 :)
    • @zen 另外,如果它回答了您的问题,请考虑接受答案。
    • cigien 我想马上接受它,但因为这是不允许的,所以会分心;-) 顺便说一句,@ 对人们来说是怎么回事,有时你可以使用它,有时不能?
    • 是的,因为您正在评论 我的 帖子,我会自动收到通知。所以它忽略了@。
    • @zen • cmets 不应该用于扩展对话。所以这样的@用例可能被认为是不必要的。您可以使用不带@ 的人名。 (耸耸肩不是我的规则,只是 StackOverflow 作为问答论坛的一般规则。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2013-10-29
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多