有没有办法避免为 std::variant class 成员中的所有类型编写构造函数?
Is there an way to avoid writing constructors for all the types in a std::variant class member?
我有一个 struct
这样的:
struct A
{
int a;
std::variant<int, float, char> b;
A() = default;
};
我想添加一个构造函数来初始化 a
和 b
。看来我必须为 b
中的所有类型编写构造函数,例如 A::A(int a1, int b1)
、A::A(int a1, float b1)
等
有没有办法避免这种情况?
您可以为您 class 创建一个模板化构造函数,并且最多应用完美转发将其参数传递给 variant
成员的构造函数:
template <typename T>
A::A(int i, T&& t) : a(i), b(std::forward<T>(t)) { }
然后,你可以这样写,例如:
A obj1(1, -7.4f); // float variant member
A obj2(2, 7); // int variant member
A obj3(3, 'c'); // char variant member
不会涉及不必要的moves/copies/temporaries。
我想类似这样的东西也能起作用,但是,它会复制您传递的变体。
A::A(int a1, std::variant<int, float, char> b1)
仅传递所需类型的能力可能是一个优势。但是,我不建议在另一个答案的解决方案中使用它。
我有一个 struct
这样的:
struct A
{
int a;
std::variant<int, float, char> b;
A() = default;
};
我想添加一个构造函数来初始化 a
和 b
。看来我必须为 b
中的所有类型编写构造函数,例如 A::A(int a1, int b1)
、A::A(int a1, float b1)
等
有没有办法避免这种情况?
您可以为您 class 创建一个模板化构造函数,并且最多应用完美转发将其参数传递给 variant
成员的构造函数:
template <typename T>
A::A(int i, T&& t) : a(i), b(std::forward<T>(t)) { }
然后,你可以这样写,例如:
A obj1(1, -7.4f); // float variant member
A obj2(2, 7); // int variant member
A obj3(3, 'c'); // char variant member
不会涉及不必要的moves/copies/temporaries。
我想类似这样的东西也能起作用,但是,它会复制您传递的变体。
A::A(int a1, std::variant<int, float, char> b1)
仅传递所需类型的能力可能是一个优势。但是,我不建议在另一个答案的解决方案中使用它。