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



我有一些代码可以有效地简化为

#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)) {}
};

最新更新