【问题标题】:Place templated std::array<std::vector<T>, N> in constructor initializer list将模板化 std::array<std::vector<T>, N> 放在构造函数初始化列表中
【发布时间】:2015-12-29 09:33:15
【问题描述】:

我有一个包含std::array&lt;std::vector&lt;T&gt;, N&gt; data_ 成员的模板类。

目前,我可以使用

template<typename T, size_t N>
class A
{
public:
    A(some parameters)
    {
         for (size_t n=0; n<N; n++) {
             data_[n].resize(calculated size from parameters);
         }
    }

private:
    std::array<std::vector<T>,N> data_;
};

是否有一些公式可以代替我将数组的初始化放在构造函数中?

例如,如果我只使用vector,然后使用索引函数,我可以有

...
A(some parameters):
    data_(std::vector<T>(N*previous size)) {}
...

【问题讨论】:

  • previous size 是什么?
  • 对不起 - 我的意思是从第一个代码示例中的参数计算的大小,在那里写为“根据参数计算的大小”
  • 对于初始化列表,我需要 N 个值,对吧?如何编写 N 个相同值的初始化列表,每个 std::vector&lt;T&gt;(calculated size)

标签: c++ arrays templates c++11


【解决方案1】:
#include <array>
#include <vector>
#include <utility>

template <typename T, std::size_t N>
class A
{
public:
    A(int a, int b) : A(a, b, std::make_index_sequence<N>{})
    { }

private:    
    template <std::size_t... Is>
    A(int a, int b, std::index_sequence<Is...>)
        : data_{ { std::vector<T>(((void)Is, a + b))... } }
    { }

    std::array<std::vector<T>, N> data_;
};

DEMO

【讨论】:

  • 哈,这很聪明:)
  • 哦,尽管您可能应该解释一下,例如此处逗号操作符的三个使用。
  • template&lt;size_t, class T&gt; T calc( T&amp;&amp; t ) { return std::forward&lt;T&gt;(t); } 然后data_{ { std::vector&lt;T&gt;(calc&lt;Is&gt;(a+b))... } } 对我来说看起来更干净。少了(void),s。也许我错了。
  • 这很好,但值得注意的是std::index_sequence&lt;..&gt; 和朋友只在 C++14 中可用。对我来说不是问题,但让我困惑了几分钟,编译器设置为 --std=c++11 给出错误
【解决方案2】:

由于您初始化的主容器是std::array,并且由于它只提供聚合初始化并且您希望参数化数组的大小,恐怕您无法按照您想要的方式进行操作。 您需要生成一个初始化序列。据我所知,只有可变参数模板才有可能。我试图将一些东西放在一起,但使用其他答案中的方法显然是这里的最佳选择。

另一方面,总是可以创建一个静态成员函数,根据需要返回数组:

Constructor (bool data) : member(initialiser(data)) {}
static array<vector<T>, N> initialiser(bool data) {
   array<vector<T>, N> container;
  // your code from above
  return container;
}

虽然这是否有用是有争议的并且取决于上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2015-09-04
    • 2012-02-10
    • 2020-05-05
    • 2015-08-05
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多