用于填充 std::variant 内部向量的可变参数模板构造函数
Variadic template constructor to fill internal vector of std::variant
我得到了以下 class
class A {
std::string name;
std::vector<std::variant<int,float>> data;
};
我的目标是有一个构造函数来用可变数量的参数填充这个 class。例子
A("hello", 1, 2.0, 1)
A("hello", 1, 2.0, 1.2)
....
我试过
template <typename... ARGS>
A(std::string n, ARGS... arguments) : name(n), data({arguments...}) {}
但是编译器抱怨说
非常量表达式无法在初始化列表中从类型 'float' 缩小到 'std::vector::size_type'。
您试图在初始化列表中多次调用数据的构造函数。请记住,可变参数模板在 编译时 展开。您可能需要在初始化列表之外处理它。类似于:
template <typename... ARGS>
A(std::string n, ARGS... arguments) : name(n) {
data.reserve(sizeof...(T));
(data.emplace_back(arguments), ...);
}
假设你有折叠表达式(AKA c++17
)。 Here 是一个活生生的例子。进一步说明,您的变体应该是双精度的,或者您应该使用 2.0f
指定输入以避免缩小转换。
我得到了以下 class
class A {
std::string name;
std::vector<std::variant<int,float>> data;
};
我的目标是有一个构造函数来用可变数量的参数填充这个 class。例子
A("hello", 1, 2.0, 1)
A("hello", 1, 2.0, 1.2)
....
我试过
template <typename... ARGS>
A(std::string n, ARGS... arguments) : name(n), data({arguments...}) {}
但是编译器抱怨说 非常量表达式无法在初始化列表中从类型 'float' 缩小到 'std::vector::size_type'。
您试图在初始化列表中多次调用数据的构造函数。请记住,可变参数模板在 编译时 展开。您可能需要在初始化列表之外处理它。类似于:
template <typename... ARGS>
A(std::string n, ARGS... arguments) : name(n) {
data.reserve(sizeof...(T));
(data.emplace_back(arguments), ...);
}
假设你有折叠表达式(AKA c++17
)。 Here 是一个活生生的例子。进一步说明,您的变体应该是双精度的,或者您应该使用 2.0f
指定输入以避免缩小转换。