[英]Using return value of constexpr function as parameter to another function
我有一個constexpr
函數,用於從字符串文字計算CRC32哈希值。
template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}
(它指的是其他constexpr
功能)
我想要做的是調用一些接受uint32_t
值的其他函數,並使用它來訪問某些unordered_map
數據。 這樣的電話看起來像這樣:
uniformByNameCRC32(ctcrc32("uPointLight.position"));
我希望"uPointLight.position"
的哈希在構建時計算一次,然后將結果常量傳遞給uniformByNameCRC32()
,但事實並非如此,並且在運行時調用ctcrc32()
基本上會殺死CPU,因為我有很多uniformByNameCRC32()
調用。
但是,這可以正常工作:
std::array<uint64_t, ctcrc32("string_literal")> array;
這樣的代碼編譯並指示ctcrc32()
的返回值確實是一個constexpr
。
我在這里錯過了什么?
OP詢問(在評論中)
如何將它包裝在某個宏中,因為我不想每次都寫兩行代碼
我想你可以使用一個接收ctcrc32
值作為模板值的函數,然后簡單地返回它。
我的意思是
template <uint32_t N>
constexpr uint32_t getCV () // get constexpr value
{ return N; }
你可以使用如下
uniformByNameCRC32(getCV<ctcrc32("uPointLight.position")>());
將ctcrc32()
值作為模板參數傳遞給getCV()
強制編譯器計算它的編譯時間。
無法保證在編譯時與C ++中的運行時間相比完成任何操作。 理論上,C ++允許您的代碼在運行時作為字符串文字傳遞給C ++解釋器。 (對於某些格式錯誤的程序有一些強制性診斷,但未指定所述診斷的形式,即使沒有不良形式,也允許您發出診斷信息,因此只需打印出一行“此代碼”將在稍后編制“滿足標准”。
constexpr
簡單地允許你在傳統上在編譯時完成的代碼中做一些事情,比如堆棧上的大小數組或者使用類型名稱中的常量。
沒有主要的C ++編譯器在運行時命名新類型。 所以,我們有一個強制在編譯時運行的東西; 在c ++ 14中我們有模板常量:
template<uint32_t v>
std::integral_constant< uint32_t, v > kint32{};
有了它,我們可以做到:
uniformByNameCRC32(kint32<ctcrc32("uPointLight.position")>);
應該在編譯時執行ctcrc32
。 不這樣做需要編譯器做很多工作。
在c ++ 17中,您甚至可以:
template<auto x>
std::integral_constant< std::decay_t<decltype(x)>, x > k{};
它適用於任何類型。
std::integral_constant
依次隱式轉換回相同類型的值。
使用中間constrexpr變量:
constexpr auto value = ctcrc32("uPointLight.position")
uniformByNameCRC32(value);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.