c++ - 根据模板参数生成不同大小的初始化列表

标签 c++ templates c++14 variadic-templates initializer-list

我有一个包含对象数组 T 的类,但没有默认构造函数。这是一个例子:

#include <iostream>

struct Param {
    int x;
};

struct A {
    A(const Param &p) {
        std::cout << p.x << std::endl;
    }
};

template<class T, int n>
struct Array {
    T data[n];
                                 /*     n times     */
    Array(const Param &p) : data{/* T(p), ..., T(p) */} { }
};

int main() {
    Param p{42};
    Array<A, 3> arr(p);
    return 0;
}

我正在寻找一种方法来初始化 data 字段,该字段使用大小不一的元素 T(p) 初始化列表,其中正好包含 n元素。感觉可以通过std::make_index_sequence这样的构造来实现,但是没找到合适的。

最佳答案

我想你可以使用委托(delegate)构造器,std::index_sequencestd::make_index_sequence 并重写 Array 如下(编辑: SergeyA 和 Rakete1111 改进了答案;谢谢!)

template <typename T, std::size_t N>
struct Array
 {
    T data[N];

    template <std::size_t ... Is>
    Array (Param const & p, std::index_sequence<Is...> const &)
       : data { ((void)Is, T{p}) ... }
     { }

    Array(const Param &p) : Array{p, std::make_index_sequence<N>{}}
     { }
 };

也许你可以让 private 成为新的构造函数。

关于c++ - 根据模板参数生成不同大小的初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805300/

相关文章:

c++ - 一个默认的默认构造函数,为什么不是用户提供的默认构造函数呢?

c++ - 如何标记粘贴号码?

c++ - Winsock:监听和接收(差异)

c++ - 使用特定模式从 Boost 获取子图

c++ - 组合元函数

c++ - QMutex with QThread - 质数搜索器

c++ - 在 C++ 中使用显式原型(prototype)进行返回类型推导

c++ - Lambda 表达式 : n3290 draft

c++ - 通过自由函数或成员函数进行扩展的机制

c++ - 将函数模板转换为函数重载集