如何为std :: array的列表初始化构造函数编写包装器?

时间:2016-11-14 22:40:46

标签: c++ arrays initializer-list

我正在编写一个包装器,为了这个问题的目的,除了包装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支持从braced-init-list分配,但不支持从std :: initializer_list

分配

那么如何在我的包装器中重现使用braced-init-list 初始化std::array的可能性,而不会牺牲我的包装器的通用性并引入会削弱包装器与包装器的兼容性的解决方案。 std::vector

2 个答案:

答案 0 :(得分:3)

而不是使用:

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

你可以使用:

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

http://ideone.com/MzRQGC处查看它。

答案 1 :(得分:-2)

请查看this问题的已接受答案。我相信它会对你正在寻找的内容做出非常详细的解释。