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

标签 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];
};

最佳答案

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;

关于c++ - 初始化模板参数长度的非默认可构造对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203108/

相关文章:

android - 为 android 64 位 arm 架构构建 native 代码

c++ - 如何将数据库中的数据存储在多维数组中

c++ - 在 C++ 中编译和链接多个文件

c++ - 将任何函数作为模板参数传递?

macos - 如何在 Mac OSX 上使用英特尔编译器获得 C++11 库支持?

c++ - 如何在程序后台运行函数(特别是自动保存函数)? QT/C++

c++ - 绕过基类构造函数调用

C++ cin for 循环没有按预期工作?

c++ - std::unique_ptr 继承切片和析构函数

c++ - 实现完美转发到 std::thread 的函数