Init std::array in class constructor initializer list : 如果默认构造函数不可用,则用固定的 class 填充值
Init std::array in class constructor initializer list : fill values with a fixed class if default constructor is not available
我有 std::array 个 类,如下所示:
class Elem {
private:
int data_;
public:
Elem(int data) : data_(data) {}
Elem() = delete;
};
class A {
private:
static const int N = 3;
std::array<Elem, N> x_;
public:
A() : x_{ { Elem(0), Elem(0), Elem(0) } } {}
};
上面的代码似乎可以工作,但是如果 'N' 很大,初始化需要太多的手动工作:
A() : x_{ { Elem(0), Elem(0), Elem(0), Elem(0), Elem(0), ... } } {}
有没有办法用固定的Elem
填充数组?注意 Elem
没有默认构造函数。我无法使用任何其他 STL 容器。
此外,建议的解决方案需要 C++11(因为数组初始化在'''A''' ctor 中)。是否有 C++03 的解决方法(即使用 VS2013)?
谢谢
埃马努埃莱
这是一个使用 std::index_sequence
和包扩展的 C++14 解决方案。将它移植到 C++11 应该不会太难,但不确定它是否可以移植到 C++03。
template <std::size_t... Is, typename F>
auto makeArrayWithHelper(std::index_sequence<Is...>, F&& f)
{
return std::array<decltype(f()), sizeof...(Is)>{((void)Is, f())...};
}
template <std::size_t N, typename F>
auto makeArrayWith(F&& f)
{
return makeArrayWithHelper(std::make_index_sequence<N>{}, std::forward<F>(f));
}
class A {
private:
static const int N = 3;
std::array<Elem, N> x_;
public:
A() : x_{makeArrayWith<N>([]{ return Elem(0); })} {}
};
我有 std::array 个 类,如下所示:
class Elem {
private:
int data_;
public:
Elem(int data) : data_(data) {}
Elem() = delete;
};
class A {
private:
static const int N = 3;
std::array<Elem, N> x_;
public:
A() : x_{ { Elem(0), Elem(0), Elem(0) } } {}
};
上面的代码似乎可以工作,但是如果 'N' 很大,初始化需要太多的手动工作:
A() : x_{ { Elem(0), Elem(0), Elem(0), Elem(0), Elem(0), ... } } {}
有没有办法用固定的Elem
填充数组?注意 Elem
没有默认构造函数。我无法使用任何其他 STL 容器。
此外,建议的解决方案需要 C++11(因为数组初始化在'''A''' ctor 中)。是否有 C++03 的解决方法(即使用 VS2013)?
谢谢
埃马努埃莱
这是一个使用 std::index_sequence
和包扩展的 C++14 解决方案。将它移植到 C++11 应该不会太难,但不确定它是否可以移植到 C++03。
template <std::size_t... Is, typename F>
auto makeArrayWithHelper(std::index_sequence<Is...>, F&& f)
{
return std::array<decltype(f()), sizeof...(Is)>{((void)Is, f())...};
}
template <std::size_t N, typename F>
auto makeArrayWith(F&& f)
{
return makeArrayWithHelper(std::make_index_sequence<N>{}, std::forward<F>(f));
}
class A {
private:
static const int N = 3;
std::array<Elem, N> x_;
public:
A() : x_{makeArrayWith<N>([]{ return Elem(0); })} {}
};