2015-09-23 37 views
4

如何在編譯時從模板參數包中創建一個std ::數組?從C++模板參數包編譯時間數組

這顯示我需要什麼,但沒有參數包。

template<typename T1, typename T2, typename T3> 
struct ToInfoArray 
{ 
    static constexpr std::array<Info, 3> value = { { T1::info, T2::info, T3::info } }; 
}; 

Live demo demonstrating the intended usage

獎金的問題: 你會使用std::arrayarray[]std::initializer_list類型的InfoArray?

回答

6
template <typename... Ts> 
struct ToInfoArray 
{ 
    static constexpr std::array<Info, sizeof...(Ts)> value = { { Ts::info... } }; 
}; 

DEMO

你會使用std ::數組,數組[]或std :: initializer_list類型的InfoArray?

std::array<T,N>。這是一個聚合,它的行爲(與性能相當)就像普通數組一樣,但爲其元素提供了額外的接口;本身,它是一種可複製的類型。

std::initializer_list在這裏不是一個選項,原因很多。一旦它用作數據成員(使用類內初始值設定項),其存儲的元素將在任何構造函數執行後失效。不能保證是文字類型,因此不能標記爲constexpr。它的大小在常量表達式中不可用(可訪問)。它不提供隨機訪問邏輯(不依靠指針算術);枚舉元素的唯一方法是從begin()迭代到end(),此外還會產生指向常量項的指針。 std::initializer_list被設計爲主要用作功能參數。

+0

可能想要說明爲什麼要'std :: array'? – Yakk

+0

@Yakk肯定,更新 –

2

用C++ 14,你可以簡單地使它成爲一個變量的模板:

template <typename... Ts> 
constexpr std::array<Info, sizeof...(Ts)> value{{Ts::info...}}; 

否則,你使用正確的語法是:

template <typename... Ts> 
struct ToInfoArray 
{ 
    static constexpr std::array<Info, sizeof...(Ts)> value{{Ts::info...}}; 
}; 

,並強烈傾向於std::array<>原始陣列或initializer_list

相關問題