【问题标题】:Changing the construction of std::array改变 std::array 的构造
【发布时间】:2014-05-07 14:01:11
【问题描述】:

我想改变std::array<unsigned int, size>的结构如下:

  • myarray a {}; 应该构造 [0,1,2,3,4...] 而不是 [0,0,0,0,...]
  • myarray a {5,2}; 应该构造 [5,2,2,3,4...] 而不是 [5,2,0,0,0...]

一个明显的解决方案是有一个类:

template <size_t size>
struct myarray {
    std::array<int, size> ar;
    myarray() { for (size_t i=0; i<size; i++) ar[i]=i; }
    myarray(std::initializer_list<unsigned int> il) :ar(il) {
        for (size_t i=il.size(); i<size; i++) ar[i]=i; 
    } 
    ...
};

但是它迫使我包装ar 的每个成员。据我了解,从std::array 继承并不是一个好主意。有没有第三种合理的方式?

【问题讨论】:

  • my_make_array(std::initializer_list&lt;T&gt;) ?
  • @Jarod42 :您是在建议某种工厂功能吗?那么如何确保始终通过此函数构造数组?我不希望用户无意中调用常用的构造函数。
  • 是的,我建议使用工厂功能。但它似乎不符合您的需求。

标签: arrays c++11 constructor


【解决方案1】:

我相信我之前关于类似主题的帖子会很有用。

https://stackoverflow.com/a/21651027/2724703

【讨论】:

  • 所以你说继承表单std::array没有关键问题。
【解决方案2】:

全局更改它是一个非常糟糕的主意。如您所知,std::cout 在内部使用std::array。即使在您自己的代码中,最小意外原则也要求std::array&lt;int, 5&gt; 创建[0,0,0,0,0]。这就是std:: 的全部意义——“STandarD”。

因此,正确的解决方案是使用一个函数,该函数返回一个您想要构造的数组。

顺便说一句,您可以将 for-loop 替换为对 std::iota(begin(ar)+il.size(), end(ar), il.size()) 的一次调用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-31
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2020-09-22
    相关资源
    最近更新 更多