用于在标题

时间:2017-09-07 14:56:51

标签: c++ global-variables header-files one-definition-rule

我遇到了这样一个伎俩:

// 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的blog了解到。

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

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

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

修改 我在SO answer中遇到了同样的技巧,它被显示为C ++ 17内联变量的替代品。

1 个答案:

答案 0 :(得分:1)

对我来说,最简单的方法是将其包装成一个函数(和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;
}