我想用结构名称的哈希初始化一个struct成员。
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)
在代码中起作用,而不是简单地用编译时常量初始化struct成员。
这显然会导致严重的性能损失,这是可以避免的。
有关如何让编译器在编译时执行此操作的任何想法或建议?我真的不想这样做:
constexpr uint32_t MY_STRUCT_ID = myHash("My_Struct");
struct My_Struct{
constexpr Test() : ID(MY_STRUCT_ID)
{
}
const uint32_t ID;
感谢。
答案 0 :(得分:4)
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;
};