【发布时间】:2016-11-14 22:40:45
【问题描述】:
我正在编写一个包装器,就这个问题而言,它除了包装一个 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。这个 sn-p 不编译(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?
【问题讨论】:
标签: c++ arrays initializer-list