使用constexpr函数的返回值作为另一个函数的参数

Pav*_*tov 5 c++ templates constexpr c++14

我有一个constexpr从字符串文字计算CRC32哈希的函数。

template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
    return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud)

(指其他constexpr功能)

我想做的是调用其他一些接受uint32_t值的函数,并使用它访问某些中的数据unordered_map。这样的调用看起来像这样:

uniformByNameCRC32(ctcrc32("uPointLight.position"));
Run Code Online (Sandbox Code Playgroud)

我希望"uPointLight.position"的哈希值在构建时进行一次计算,然后将结果常量传递给uniformByNameCRC32(),但事实并非如此,并ctcrc32()在运行时被调用,这基本上会杀死CPU,因为我有很多uniformByNameCRC32()调用。

但是,这很好用:

std::array<uint64_t, ctcrc32("string_literal")> array;
Run Code Online (Sandbox Code Playgroud)

这样的代码将编译并指示ctcrc32()的返回值确实是一个constexpr

我在这里想念什么?

Jar*_*d42 2

使用中间 constrexpr 变量:

constexpr auto value = ctcrc32("uPointLight.position")
uniformByNameCRC32(value);
Run Code Online (Sandbox Code Playgroud)