![](/img/trans.png)
[英]How to initialize std::array member in constructor initialization list when the size of the array is a template parameter
[英]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.