初始化模板参数长度的非默认可构造对象的数组

时间:2013-10-05 21:51:01

标签: c++ c++11

有没有办法构造numObjects长度的非默认可构造对象数组,其中numObjects是模板参数?例如......

struct NonDefaultConstructibleClass
{
    NonDefaultConstructibleClass(int){}
};

template<size_t numObjects>
struct Thing
{
    Thing() : m_Objects{{3, 3, 3, /*... numObjects times */}} {}

    NonDefaultConstructibleClass m_Objects[numObjects];
};

1 个答案:

答案 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)...}
    { }
};

indexesbuild_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;