用于填充 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 指定输入以避免缩小转换。