在标头中定义全局数组的模板技巧



我遇到了这样的技巧:

// This template utilizes the One Definition Rule to create global arrays in a header.
template<typename unused=void>
struct globals_struct
{
static const uint8 s_str_serialize_flags[256];
// ...
};
typedef globals_struct<> globals;
template<typename unused>
const uint8 globals_struct<unused>::s_str_serialize_flags[256] =
{
// ... data here ...
};
// ... and then the array is accessible as:
uint8 value = globals::s_str_serialize_flags[index])

这段代码来自 Rich Geldreich 的 Purple JSON,这是我从 Chad Austin的博客中了解到的。

在看到这段代码之前,我认为在仅标头库中拥有数组的唯一方法是要求用户在一个文件中#define一个魔术宏(在包含标头之前)。

所以我喜欢模板包装技巧,但我想知道:

  • 这是一个C++成语(它有名字吗)?
  • 它是否符合标准且使用安全?
  • 这样的模板包装是在标头中包含数组的最简单方法吗?

编辑:我刚刚在 SO 答案中遇到了同样的技巧,它显示为 C++17 个内联变量的替代品。

对我来说最简单的是将其包装成一个函数(和std::array)

using arr256 = std::array<std::uint8_t, 256>;
inline constexpr arr256 s_str_serialize_flags() {
constexpr arr256 values = {/**/};
return values;
}

或者没有constexpr约束:

using arr256 = std::uint8_t[256];
inline const arr256& s_str_serialize_flags() {
static const arr256 values = {/**/};
return values;
}

相关内容

  • 没有找到相关文章

最新更新