2016-02-18 47 views
1

我需要將參數傳遞給一個包裝類,看起來小例子是這樣的:的std :: initializer_list作爲的std ::數組構造

template<class TStack, unsigned int TBins> 
class Wrapper : Stack<......> 
{ 
    std::array<TStack, TBins> m_oStacks; 

    template<typename ... Args> 
    Wrapper(std::initializer_list<const unsigned int> const& size, Args&&... args) 
    : Stack<.......>(args), m_oStacks{5,2,3,4,5,6,7,8,9,10} 
    //, m_oStacks(size) //,m_oStacks{size} //,m_oStacks{{size}} 
    { 
     //m_oStacks = { size };   
    } 
}; 

我試圖初始化與initializer_list的大小,但沒有什麼工作數組(註釋部分來源)只有常量{5,2,3,4,5,6,7,8,9,10}部分

有人知道原因和解決辦法嗎?

真誠 Matyro

編輯1:主要的問題是,T堆確實(在大多數情況下)沒有默認的構造函數,因此我需要在施工

+0

@Matyro類的std ::陣列不具有接受initializer_list的構造函數。您應該自己複製array中的initializer_list。 –

+1

使用'std :: array '代替'std :: initializer_list ',它也可以被列表初始化,並且'std :: array'本身也有一個拷貝構造函數 –

+0

該解決方案工作正常,thx – Matyro

回答

2

數組初始化std::initializer_list

template <typename TStack, std::size_t TBins> 
class Wrapper 
{ 
public: 
    Wrapper(std::initializer_list<unsigned int> il) 
     : Wrapper(il, std::make_index_sequence<TBins>{}) 
    { 
    } 

private: 
    template <std::size_t... Is> 
    Wrapper(std::initializer_list<unsigned int> il, std::index_sequence<Is...>) 
     : m_oStacks{{ *(il.begin() + Is)... }} 
    { 
    } 

    std::array<TStack, TBins> m_oStacks; 
}; 

DEMO

隨着std::array

template <typename TStack, std::size_t TBins> 
class Wrapper 
{ 
public: 
    Wrapper(const std::array<unsigned int, TBins>& a) 
     : Wrapper(a, std::make_index_sequence<TBins>{}) 
    { 
    } 

private: 
    template <std::size_t... Is> 
    Wrapper(const std::array<unsigned int, TBins>& a, std::index_sequence<Is...>) 
     : m_oStacks{{ a[Is]... }} 
    { 
    } 

    std::array<TStack, TBins> m_oStacks; 
}; 

DEMO 2

+0

@NathanOliver [爲什麼不?](http://coliru.stacked-crooked.com/a/98203861e7a3ad52) –

+0

我不認爲通過所有的方式。看起來很棒。 – NathanOliver

+1

如果'il'的長度小於TBINS,則第一種情況會導致UB。 –

相關問題