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

Initialize static vector by template arguments

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

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

 private:
  static vector<int> my_vector_;
}

只需将参数列表扩展为初始化列表即可。

my_vector_ {args...};

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

但是请注意,您不能在 class 定义中初始化非文字类型的 static 数据成员。如果你只有一个编译单元(因为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 classes 更有用,如上所示将定义放入头文件会导致违反 one 定义规则( 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 违规不是问题。