在运行时使用模板的constexPR

Use a templated constexpr at runtime

本文关键字:constexPR 运行时      更新时间:2023-10-16

我喜欢的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只能与在编译时间已知大小的字符阵列(它们不必是constconstexpr,但必须知道大小(。

我根据链接问题的原始实现编写了一个答案,该问题允许编译时间和运行时字符串:

https://stackoverflow.com/a/48924267/2666289