有没有办法避免为 std::variant 类成员中的所有类型编写构造函数?

In7*_*n78 1 c++ constructor variant c++17

我有一个struct这样的:

struct A
{
    int a;
    std::variant<int, float, char> b;

    A() = default;
};
Run Code Online (Sandbox Code Playgroud)

我想添加一个构造函数来初始化ab。看来我必须写一个构造函数中的所有类型b一样A::A(int a1, int b1)A::A(int a1, float b1)等等。

有没有办法避免这种情况?

Dan*_*ica 8

您可以为您的类创建一个模板化的构造函数,并且充其量应用完美转发将其参数传递给variant成员的构造函数:

template <typename T>
A::A(int i, T&& t) : a(i), b(std::forward<T>(t)) { }
Run Code Online (Sandbox Code Playgroud)

然后,您可以编写,例如:

A obj1(1, -7.4f);  // float variant member
A obj2(2, 7);      // int variant member
A obj3(3, 'c');    // char variant member
Run Code Online (Sandbox Code Playgroud)

不会涉及不必要的移动/复制/临时。