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

Template trick to define a global array in the header

我遇到过这样的把戏:

// 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 that I learnt about from Chad Austin's blog

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

所以我喜欢 template-wrapping 技巧,但我想知道:

编辑: 我刚刚在 中遇到了同样的技巧,它显示为 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;
}