通过模板参数初始化静态向量

时间:2015-12-18 15:35:25

标签: c++ templates vector metaprogramming template-meta-programming

如何从模板参数中初始化以下类中的静态成员向量?换句话说,我想在my_vector_函数之前将所有模板参数插​​入main()。参数的顺序也应该保存在向量中。

template <int... args>
class MyClass {
 public:
  MyClass();

 private:
  static vector<int> my_vector_;
}

1 个答案:

答案 0 :(得分:4)

只需将参数列表展开到初始化列表中即可。

my_vector_ {args...};

但是,你确定你真的想要这样做吗?除非您在运行时添加/删除项目,否则您不会需要动态存储,并且同样可以使用std::array

但请注意,您可能无法在static定义中初始化非文字类型的class数据成员。如果您只有一个编译单元(因为在源文件中定义了template),则可以执行此操作。

#include <array>
#include <iostream>

template <int... Args>
struct example
{
  // inline declaration
  static const std::array<int, sizeof...(Args)> numbers;   
};

// outline definition and initialization
template <int... Args>
const std::array<int, sizeof...(Args)> example<Args...>::numbers = {{Args...}};

int
main()
{
  std::cout << example<14, 92>::numbers[0] << std::endl;
}

如果要使template可用于多个翻译单元(因此在头文件中提供),则这变得很麻烦。在这种情况下,我建议您改用函数。

另一种选择是改为使用函数。这对非template class更有用,因为如上所示将定义放入头文件会导致违反一个定义规则(ODR)。

#include <array>
#include <iostream>

template <int... Args>
struct example
{

  static const std::array<int, sizeof...(Args)>&
  numbers() noexcept
  {
    static const std::array<int, sizeof...(Args)> thenumbers = {{Args...}};
    return thenumbers;
  }

};

int
main()
{
  std::cout << example<14, 92>::numbers()[0] << std::endl;
}

实际上,我建议你这样做,因为即使ODR违规不成问题我也觉得它更简单。