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

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

本文关键字:构造函数 包装 初始化 列表 std array      更新时间:2023-10-16

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

那么,我如何在我的包装器中重现用括号初始化列表初始化std::array的可能性,而不牺牲包装器的一般性并引入将削弱包装器与例如std::vector的兼容性的解决方案?

不用:

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

你可以使用:

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