You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:54