2017-04-06 136 views
0

我想用结构名称的散列来初始化结构成员。constexpr构造函数初始化列表中的Constexpr函数

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; 

谢谢。

回答

2

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; 
}; 
+0

谢谢,这个(或这方面的一些变化)可以工作。 – Flip