我遇到了这样一个伎俩:
// 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
一个魔术宏(在包含标题之前)。
所以我喜欢模板包装技巧,但我想知道:
修改 我在SO answer中遇到了同样的技巧,它被显示为C ++ 17内联变量的替代品。
答案 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;
}