3

有什么方法可以构造一个numObjects长度numObjects为模板参数的非默认可构造对象数组?例如...

struct NonDefaultConstructibleClass
{
    NonDefaultConstructibleClass(int){}
};

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

    NonDefaultConstructibleClass m_Objects[numObjects];
};
4

1 回答 1

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;
于 2013-10-05T22:04:45.657 回答