C++ 如何为std::array';s列表初始化构造函数?
为了这个问题,我正在编写一个包装器,它只包装一个SequenceContainer(),并复制包装容器提供的SequenceContainer概念的所有功能 我尝试编写这样一个包装器,如下所示:C++ 如何为std::array';s列表初始化构造函数?,c++,arrays,initializer-list,C++,Arrays,Initializer List,为了这个问题,我正在编写一个包装器,它只包装一个SequenceContainer(),并复制包装容器提供的SequenceContainer概念的所有功能 我尝试编写这样一个包装器,如下所示: template<class Container> class SequenceContainerWrapper { Container cont; public: using value_type = typename Container::value_type; using
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::array
。此代码段不编译():
intmain()
{
SequenceContainerRapper):
数组支持从带括号的init列表分配,但不支持从std::initializer\u列表分配
因此,我如何在我的包装器中重现使用括号内的init list初始化std::array
,而不牺牲我的包装器的通用性,并引入会削弱包装器与(例如std::vector
)兼容的解决方案,而不是使用:
SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
查看它在。上工作,而不是使用:
SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
看到它在工作。谢谢。但是,出于简单的好奇:如果一个复制构造函数是您所需要的一切,并且还将涉及初始化器列表初始化,那么为什么std::vector
提供这两个构造函数呢?我们既有vector(const vector&other);
又有vector(std::initializer\u list init)
在那里。不会向量(常量向量和其他)
足够了吗?我的想法是,在您出色的解决方案中,将有一个构造函数重载std::vector
,我不会显式包装;因此,假设标准库不提供冗余函数,那么必须至少有一个std::vector
的用例,如果std::vector
未提供vector(std::initializer\u list init)
,在构造SequenceContainerRapper
的调用中,您将无法使用std::initializer\u list
来构造临时std::vector
。因此,std::vector
仍有一个用例,我将不介绍:SequenceContainerRapper vec2({1,2,3,4})
不幸的是,这是一个重要的用例,因为我确实嵌套了这些包装器,每个包装器稍微改变容器的行为,以使用稍微不同的包装器的正确链来实现期望的结果
我可以嵌套这些包装器,但不幸的是,ofc破坏了std::array
…Dang。谢谢。但是,出于简单的好奇:如果一个拷贝构造函数是您所需要的一切,并且还将涵盖初始化器列表初始化,那么为什么std::vector
同时提供这两个构造函数?我们都有vector(常量向量和其他);
和向量(std::initializer_list init);
在那里。不会向量(常量向量和其他)
足够了吗?我的想法是,在您出色的解决方案中,将有一个构造函数重载std::vector
,我不会显式包装;因此,假设标准库不提供冗余函数,那么必须至少有一个std::vector
的用例,如果std::vector
未提供vector(std::initializer\u list init)
,在构造SequenceContainerRapper
的调用中,您将无法使用std::initializer\u list
来构造临时std::vector
。因此,std::vector
仍有一个用例,我将不介绍:SequenceContainerRapper vec2({1,2,3,4})
不幸的是,这是一个重要的用例,因为我确实嵌套了这些包装器,每个包装器稍微改变容器的行为,以使用稍微不同的包装器的正确链来实现期望的结果我可以嵌套这些包装,但不幸的是,这ofc破坏了std::array
…当。
SequenceContainerWrapper(initializer_list<value_type> init) : cont(init) {}
SequenceContainerWrapper(Container init) : cont(std::move(init)) {}