c++ - 修改成员初始值设定项列表

标签 c++ initializer-list member-initialization

我有一些代码可以有效地减少到

#include <vector>
class A {
    std::vector<int> m_sizes;
public:
    A(std::initializer_list<int> const& sizes) : m_sizes(sizes) {}
};

class B {
    A m_a;
public:
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a({ size_front, sizes, size_back }) {}
};

编译器提示没有 A::A 的实例匹配参数列表。 有没有办法压平 { int, std::initializer_list<int>, int }std::initializer_list<int>或者我必须给 A一个额外的构造函数来处理这种情况?如果我无法修改A怎么办?类?

最佳答案

您尝试做的事情是不可能的:initializer_list<T>必须由 T 类型的项目列表构建,其计数在编译时已知。在中间插入现有列表不起作用。

您可以通过添加采用 vector<int> 的构造函数重载来解决此问题。直接,然后转发对其的调用:

class A {
    std::vector<int> m_sizes;
public:
    A(const std::vector<int>& sizes) : m_sizes(sizes) {}
    A(std::initializer_list<int> const& sizes) : A(std::vector(sizes)) {}
};
class B {
    A m_a;
    std::vector<int> frame(int size_front, int size_back, std::initializer_list<int> const& sizes) {
        std::vector res;
        res.push_back(size_front);
        std::copy(sizes.begin(), sizes.end(), std::back_inserter(res));
        res.push_back(size_back);
        return res;
    }
public:
    B(int size_front, int size_back, std::initializer_list<int> const& sizes) : m_a(frame(size_front, size_back, sizes)) {}
};

关于c++ - 修改成员初始值设定项列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42089104/

相关文章:

c++ - 为什么初始化列表会导致 2 个数据拷贝,而不仅仅是一个拷贝将其传递给函数?

c++ - 在默认初始化程序 gcc 与 clang 中使用 lambda

c++ - 返回所选类型的元组的类型函数

c++ - 指向虚类的指针

C++ 初始值设定项列表成员仍在调用默认构造函数?

c++ - 不同类的构造函数重载解析

javascript - 在 JS 中使用 null 声明文字成员以便稍后初始化是可行的做法吗?

c++ - 常量变量初始化仅适用于成员初始化列表

c++ - 如何将 WIN32_FIND_DATA 转换为字符串?

c++ - 有没有一种方法可以计算 CGAL 中 Surface_mesh 对象的 pca?