2017-04-06 137 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