在运行时使用模板的constexPR
Use a templated constexpr at runtime
我喜欢的CRC32实现:cygnusx1 crc32
它在编译时间效果很好:
ctcrc32("StackOverflow");
但是可以在运行时使用它:
void myfunction(const std::string& str)
{
uint32_t hash = ctcrc32(str);
// ...
}
到目前为止,我不得不重写另一个(运行时(功能,但只想使用一个功能。
编辑
我确实尝试过
ctcrc32(str.c_str())
但是它不起作用(**不匹配的类型" const char [len]'和" const char*" **(。似乎需要编译时长度。
这是实现:
namespace detail {
// CRC32 Table (zlib polynomial)
static constexpr uint32_t crc_table[256] = { 0x00000000L, 0x77073096L, ... }
template<size_t idx>
constexpr uint32_t combine_crc32(const char * str, uint32_t part) {
return (part >> 8) ^ crc_table[(part ^ str[idx]) & 0x000000FF];
}
template<size_t idx>
constexpr uint32_t crc32(const char * str) {
return combine_crc32<idx>(str, crc32<idx - 1>(str));
}
// This is the stop-recursion function
template<>
constexpr uint32_t crc32<size_t(-1)>(const char * str) {
return 0xFFFFFFFF;
}
} //namespace detail
template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}
如果不重写std::string
,则不能使用它。如果您查看主要功能:
template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}
...您看到它需要在编译时间的字符串长度,因为它将其用作模板参数(detail::crc32<len - 2>
(。
ctcrc32
只能与在编译时间已知大小的字符阵列(它们不必是const
或constexpr
,但必须知道大小(。
我根据链接问题的原始实现编写了一个答案,该问题允许编译时间和运行时字符串:
https://stackoverflow.com/a/48924267/2666289
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何在 constexpr 函数中实现回退运行时
- 在评估不同参数的constexpr函数时,运行时差异
- 在运行时呼叫处理constexPR.C
- 在运行时使用模板的constexPR
- 将 constexpr 结构转换为运行时结构
- C++11 打印运行时变量名称等于某个 constexpr 变量
- 在编译期间或运行时确定“constexpr”的执行
- 为什么constexpr函数能很好地与运行时生成的变量配合使用
- 将静态 constexpr 类成员分配给运行时变量
- 使用 const char 数组参数分析 constexpr 显示运行时执行
- 如何将这个运行时高效的函数转换为constexpr
- C++-Static_assert和constexpr函数在运行时求值的能力
- constexpr函数中的编译时或运行时检测
- 如何在constexpr函数中执行运行时断言?
- 如何确保constexpr函数在运行时永远不会被调用
- Constexpr在运行时的性能更差