簡體   English   中英

使用constexpr函數的返回值作為另一個函數的參數

[英]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 ++編譯器在運行時命名新類型。 所以,我們有一個強制在編譯時運行的東西; 我們有模板常量:

template<uint32_t v>
std::integral_constant< uint32_t, v > kint32{};

有了它,我們可以做到:

uniformByNameCRC32(kint32<ctcrc32("uPointLight.position")>);

應該在編譯時執行ctcrc32 不這樣做需要編譯器做很多工作。

您甚至可以:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM