如何为 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支持从带括号的init-list中赋值,但不支持从std::initializer_list中赋值
那么,我如何在我的包装器中重现用括号初始化列表初始化std::array
的可能性,而不牺牲包装器的一般性并引入将削弱包装器与例如std::vector
的兼容性的解决方案?
不用:
SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
你可以使用:
SequenceContainerWrapper(Container init) : cont(std::move(init)) {}
相关文章:
- 线程构造函数周围的可变参数模板包装器无法编译
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 无法理解包装类的构造函数的声明
- Boost Python - 用参数包装构造函数
- 标准库中是否有与 std::thread 的构造函数语义匹配的类型擦除函数包装器?
- 重构现有包装类,以使用与包装器本身相同的构造函数参数包装 T
- 如何为包装容器的模板类编写构造函数,其中容器可以是数组或向量
- SWIG - 如何使用采用'const double*'的构造函数将类包装为 python
- 将 C 结构工厂函数与其相应的 C++ 包装类构造函数合并
- 将C 模板构造函数包装在模板类中
- 如何声明包装器类型 X 的移动构造函数<T> noexcept 取决于is_nothrow_move_constructible<T>?
- 通过包装器对象的构造函数将依赖关系传递给包装器对象
- 如何使包装类将其构造函数参数转发到 std::vector 的构造函数?
- 通过c++中的包装器将arment列表传递给构造函数
- boost-python:如何提供自定义构造函数包装器函数
- std::vector包装器的构造函数
- SWIG 3使用模板化构造函数包装未模板化的类
- 用std::类似向量的构造函数对C数组进行Constexpr包装
- 如何在SWIG包装C++代码中向目标语言(特别是Python)添加替代构造函数
- 当<T> T 没有复制构造函数时,std::queue 的虚拟包装器不会编译