【问题标题】:How to write a wrapper for std::array's list initialization constructor?如何为 std::array 的列表初始化构造函数编写包装器?
【发布时间】: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


    【解决方案1】:

    而不是使用:

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

    你可以使用:

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

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

    【讨论】:

    • 谢谢。但是,出于简单的好奇心:如果复制构造函数是您所需要的一切,并且还将涵盖初始化器列表初始化,那么为什么 std::vector 提供这两个构造函数? en.cppreference.com/w/cpp/container/vector/vector 我们有vector( const vector&amp; other );vector( std::initializer_list&lt;T&gt; init );vector( const vector&amp; other ); 不够吗?
    • 我的想法是,通过您的出色解决方案,将有一个 std::vector 的构造函数重载,我不会明确包装;所以,假设标准库不提供冗余功能,那么至少有一个std::vector 的用例我将无法涵盖......
    • @gaazkam,如果std::vector 没有提供vector( std::initializer_list&lt;T&gt; init ),您将无法在调用构造SequenceContainerWrapper 时使用std::initializer_list 构造临时std::vector .
    • 所以……还有一个 std::vector 的用例我不会介绍:SequenceContainerWrapper&lt;SequenceContainerWrapper&lt;std::vector&lt;int&gt;&gt;&gt; vec2({1,2,3,4}); ideone.com/Kv5YtM 不幸的是,这是一个重要的用例,因为我确实嵌套了这些包装器,每个交替容器的行为略有不同,以使用稍微不同的包装器的正确链来达到预期的结果。
    • 使用 SequenceContainerWrapper(initializer_list&lt;value_type&gt; init) : cont(init) {} 我可以嵌套这些包装器 ideone.com/EKywvb ,但不幸的是,这个 ofc 破坏了 std::array... Dang。
    猜你喜欢
    • 2022-01-22
    • 2015-09-04
    • 1970-01-01
    • 2017-05-02
    • 2019-04-28
    • 2016-02-16
    • 2015-12-29
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多