有什么方法可以构造一个长度为 numObjects
的非默认可构造对象数组,其中 numObjects
是模板参数?例如……
struct NonDefaultConstructibleClass
{
NonDefaultConstructibleClass(int){}
};
template<size_t numObjects>
struct Thing
{
Thing() : m_Objects{{3, 3, 3, /*... numObjects times */}} {}
NonDefaultConstructibleClass m_Objects[numObjects];
};
最佳答案
在 Thing
的构造函数中,您可以创建一个包含 N
元素的参数包,并将构造转发给可变参数构造函数。可变参数构造函数使用常规参数扩展来初始化数组。
template <std::size_t N>
struct Thing
{
NonDefaultConstructibleClass _elements[N];
Thing() : Thing{build_indexes<N>{}} { }
template <std::size_t... Indexes>
Thing(indexes<Indexes...>)
: _elements{(Indexes, 3)...}
{ }
};
indexes
和 build_indexes
是简单的辅助类。 C++14 很可能包含类似的内容 (std::integer_sequence
)。在 GCC 中,您可以使用以下类型别名:
template <std::size_t ...Indexes>
using indexes = std::_Index_tuple<Indexes...>;
template <std::size_t N>
using build_indexes = typename std::_Build_index_tuple<N>::_type;
关于c++ - 初始化模板参数长度的非默认可构造对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203108/