gpt4 book ai didi

c++ - constexpr 构造函数初始化列表中的 Constexpr 函数

转载 作者:太空宇宙 更新时间:2023-11-04 16:01:25 28 4
gpt4 key购买 nike

我想用结构名称的哈希值初始化一个结构成员。

constexpr uint32_t myHash(const char* const data)
{ //Some code for hash
return myHash;
}

struct My_Struct{
constexpr Test() : ID(myHash("My_Struct"))
{
}
const uint32_t ID;
}

当我有:

constexpr My_Struct my_constexpr_struct;

然后在编译时成功计算哈希值。但是,当我在我的主要功能中时

My_Struct my_normal_struct;

然后它会调用

constexpr uint32_t myHash(const char* const data)

在代码中运行,而不是简单地使用编译时常量初始化结构成员。

这显然会导致显着的性能损失,而这是可以避免的。

关于如何让编译器在编译时执行此操作的任何想法或建议?我真的不想这样做:

constexpr uint32_t MY_STRUCT_ID = myHash("My_Struct");
struct My_Struct{
constexpr Test() : ID(MY_STRUCT_ID)
{
}
const uint32_t ID;

谢谢。

最佳答案

constexpr 是请求,不是要求。因此,如果您在常量表达式上下文之外初始化一个对象,即使通过 constexpr 构造函数,也无法保证初始化将在编译时完成。

如果您想保证编译时评估,您必须在常量表达式上下文中调用constexpr 函数。如果变量的显式使用在某种程度上冒犯了您,您总是可以通过使用模板来强制执行 constexpr 评估:

template<typename T, T t>
struct repeat
{
using value_type = T;
static constexpr T value = t;
constexpr T operator()() const noexcept {return t;}
};

struct My_Struct{
constexpr My_Struct() : ID(repeat<uint32_t, myHash("My_Struct")>::value)
{
}
const uint32_t ID;
};

关于c++ - constexpr 构造函数初始化列表中的 Constexpr 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43255888/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com