【问题标题】:Initialize static vector by template arguments通过模板参数初始化静态向量
【发布时间】:2016-03-25 08:45:07
【问题描述】:

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

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

 private:
  static vector<int> my_vector_;
}

【问题讨论】:

  • 是否要将向量初始化为默认值?
  • std::array 不是更好的主意吗?

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


【解决方案1】:

只需将参数列表展开为初始化列表。

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 可用于多个翻译单元(并因此在头文件中提供),这将变得很麻烦。在这种情况下,我建议您改用函数。

另一种选择是使用函数。这对于非templateclasses 更有用,因为如上所示将定义放入头文件会导致违反一个定义规则 (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 违规不是问题,我也发现它更简单。

【讨论】:

  • 我会有几个 MyClass 实例,我确信我每次都会访问该向量。因此,我不想每次都创建和填充该向量。
  • 我同意 std::array 在我的情况下更好。
  • @Fake A static 变量就可以了。我只是在挑选“main之前”部分。
  • @Fake 我的原始代码 sn-p 实际上无法编译。请查看更新后的答案。
  • 感谢您的回答。似乎我必须将其更改为“thenumbers = {{Args...}}”以避免任何警告。
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多