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

C++ 初始化模板参数长度的非默认可构造对象数组,c++,c++11,C++,C++11,是否有任何方法可以构造长度为numObjects的非默认可构造对象数组,其中numObjects是模板参数?例如 struct NonDefaultConstructibleClass { NonDefaultConstructibleClass(int){} }; template<size_t numObjects> struct Thing { Thing() : m_Objects{{3, 3, 3, /*... numObjects times */}}

是否有任何方法可以构造长度为
numObjects
的非默认可构造对象数组,其中
numObjects
是模板参数?例如

struct NonDefaultConstructibleClass
{
    NonDefaultConstructibleClass(int){}
};

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

    NonDefaultConstructibleClass m_Objects[numObjects];
};
struct非默认可构造类
{
非默认可构造类(int){}
};
模板
结构物
{
Thing():m_Objects{{{3,3,3,/*…numObjects times*/}{}
非默认可构造类m_对象[NumObject];
};

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

如果数组是
std::array
你甚至不需要向前构造:只需调用一个helper函数。如果您的编译器不支持转发构造函数,或者您发现额外的构造函数会分散您的注意力,那么这将非常有用。
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;