如何为std::variant编写委托构造函数,实现结构体B的隐式转换?
实现std::variant<A1,A2>到B的委托构造函数
直接在B的const A&构造函数初始化列表中使用std::visit配合lambda表达式,就能实现符合风格的简洁写法,同时支持隐式类型转换。
修改后的完整代码:
#include <variant> struct A1 {}; struct A2 {}; using A = std::variant<A1, A2>; struct B { B(const A1 &){} B(const A2 &){} // 利用std::visit委托到对应构造函数 B(const A& a) : B(std::visit([](const auto& val) { return B(val); }, a)) {} }; // 测试隐式转换 void func(B b) {} int main(int argc, char *argv[]) { A a1 = A1{}; func(a1); // 隐式转换生效,A自动转为B A a2 = A2{}; func(a2); return 0; }
关键逻辑说明:
std::visit会自动识别variant当前存储的是A1还是A2,执行对应的lambda逻辑- lambda拿到
A1或A2的引用后,直接调用已定义的B构造函数生成临时B对象 - 构造函数通过委托机制,用这个临时对象完成自身初始化(现代编译器会优化掉多余的拷贝,无需担心性能)
- 所有构造函数都未加
explicit修饰,因此A类型对象可以隐式转换为B,满足你的需求
内容的提问来源于stack exchange,提问作者phinz
相关产品推荐
相关产品推荐

