当前位置: 首页 > 知识库问答 >
问题:

当数组的大小是模板参数时,如何在构造函数初始化列表中初始化std::array成员

洪彬
2023-03-14

在下面的示例中,我需要初始化A::A(H H)构造函数初始值设定项列表中的std::array(因为类H没有默认的构造函数),但我不能使用初始值设定项列表,因为数组大小是一个模板参数。

有办法解决这个问题吗?

#include <array>
using namespace std;

struct Hash {
    const vector<int> &data;

    Hash(const vector<int> &data)
        : data(data) {
    }

    uint64_t operator()(int id) const {
        return data[id];
    }
};

template <class H, size_t N>
class A {
public:
    A(H h) {
    }

    std::array<H, N> hashes;
};
    

int main () {
    vector<int> data{1, 2, 3, 4};

    A<Hash, 4> a{Hash(data)};
}

共有1个答案

孙渝
2023-03-14

为了简化创建和扩展大小不固定的包的元编程任务,提供了std::index\u序列。使用std::make\u index\u sequence并将构造委托给某个私有构造函数,该构造函数可以推断包:

A(H h) : A(h, std::make_index_sequence<N>{}) {}

template <std::size_t... i>
A(H h, std::index_sequence<i...>) : hashes{((void)i, h)...} {}

在这里,((val)i, h)是一个逗号表达式,计算结果为h,但由于我们在其中提到了packi,因此有资格使用...进行扩展。结果是hN副本(i的每个元素一个)。此扩展发生在括号初始化列表中,因此结果是括号初始化列表,包含hN副本,然后将初始化hash成员。

 类似资料:
  • 本质上,我想要一个具有数组的模板类,其大小是一个模板参数,以保存常量内容。 类似于: 我一直在搜索和修补一点,几乎有一个解决方法实现了一个中间静态方法,并使用std::array: ...这已经是相当多的样板,但仍然d::array似乎不是从初始化列表中构建的?:-(

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 问题内容: 我有这个类的构造函数: 问题是,我想创建此类的数组,如何对其进行初始化? 不起作用。 更新 我需要做这样的事情吗? 然后初始化每个对象? 问题答案: 在创建数组时,您正在创建类别数组。那是数组的一个实例。 当用Category对象填充数组时,此时将使用带有Const的Category。

  • 我想在构造函数中初始化二维数组。但是,我在类中声明数组的实例变量时遇到了一个问题。如果我这样做就错了: 我怎么解决这个问题?

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段

  • 我有一个模板参数为T的类template Templ,Templ类有一个类型为T的数据成员,称为obj。我编写了一个可变构造函数模板,将参数转发给obj的构造函数: 现在我意识到类型T可能是一个具有init list构造函数的类,我希望它可以通过temp访问。所以我检查了什么是std::list::emplace和make\u shared。它们有一个像我一样的可变函数,但它们没有采用初始化列表的