有没有办法构造numObjects
长度的非默认可构造对象数组,其中numObjects
是模板参数?例如......
struct NonDefaultConstructibleClass
{
NonDefaultConstructibleClass(int){}
};
template<size_t numObjects>
struct Thing
{
Thing() : m_Objects{{3, 3, 3, /*... numObjects times */}} {}
NonDefaultConstructibleClass m_Objects[numObjects];
};
答案 0 :(得分:3)
在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;