2017-09-07 55 views
2

我碰到過這樣的伎倆來定義一個全局數組:模板招在頭

// 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]) 

此代碼是從豐富Geldreich的Purple JSON,我從乍得奧斯汀的blog瞭解。

在看到這段代碼之前,我認爲只有標題庫中有一個數組的唯一方法是要求用戶在一個文件中(包括標題之前)對#define一個魔術宏。

所以我喜歡的模板,包裝伎倆,但我想知道:

  • 它是一個C++成語(它有一個名字)?
  • 它是否符合標準並且安全使用?
  • 是這樣一個模板包裝最簡單的方法在頭中有一個數組?

編輯: 我只是在一個SO answer跨相同特技來到其中顯示作爲一種替代C++ 17個內嵌變量。

回答

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; 
} 
+0

'錯誤: '值' 中聲明 '靜態'' constexpr'function' – marcin

+0

@marcin:可悲的是它不允許這種方式: - /通過替代方法修正(保留'constexpr')。 – Jarod42