0

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

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; 

谢谢。

4

1 回答 1

5

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; 
};
于 2017-04-06T13:12:10.967 回答