簡體   English   中英

如何為std :: array的列表初始化構造函數編寫包裝器?

[英]How to write a wrapper for std::array's list initialization constructor?

我正在編寫一個包裝程序,出於這個問題的目的,它只包裝了SequenceContainer( http://en.cppreference.com/w/cpp/concept/SequenceContainer ),並重現了包裝好的SequenceContainer概念的所有功能集裝箱報價。

我寫這樣一個包裝器的嘗試看起來像這樣:

template<class Container>
class SequenceContainerWrapper
{
  Container cont;
public:
  using value_type = typename Container::value_type;
  using reference = typename Container::reference;
  using size_type = typename Container::size_type;
  SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
  reference operator[] (size_type n) {return cont[n];}
  // lots of other code that does nothing but wrapping
};

是的,例如,我可以將其與std::vector 以下代碼可以按預期方式編譯和運行( http://ideone.com/sYeIeJ ):

int main()
{
    SequenceContainerWrapper<vector<int>> vec({1,2,3,4});
    cout << vec[2] << '\n';
}

但是,此構造函數不適用於std::array 該代碼段無法編譯( http://ideone.com/5nZhar ):

int main()
{
    SequenceContainerWrapper<array<int, 4>> arr({1,2,3,4});
    cout << arr[2] << '\n';
}

這是因為( http://en.cppreference.com/w/cpp/concept/SequenceContainer#cite_note-1 ):

std :: array支持通過括號初始列表進行賦值,但不支持通過std :: initializer_list進行賦值

那么,如何在包裝器中重現用括號初始列表初始化std::array的可能性, 而又不犧牲包裝器的通用性,並引入一些會破壞包裝器與例如std::vector的兼容性的解決方案?

而不是使用:

SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}

您可以使用:

SequenceContainerWrapper(Container init) : cont(std::move(init)) {}

http://ideone.com/MzRQGC上查看它的工作原理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM