如何从模板参数中初始化以下类中的静态成员向量?换句话说,我想在my_vector_
函数之前将所有模板参数插入main()
。参数的顺序也应该保存在向量中。
template <int... args>
class MyClass {
public:
MyClass();
private:
static vector<int> my_vector_;
}
答案 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违规不成问题我也觉得它更简单。