我有一些代码可以有效地减少到
#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
课程怎么办?
答案 0 :(得分:2)
您尝试做的事情是不可能的: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)) {}
};