c++17 - 如何将 std::variant 与非平凡的用户对象(稍后构建)一起使用,并让访问者使用自动 lambda?
问题描述
我有这样的代码:
using variant_t = std::variant<MyObj1, MyObj2, MyObj3>;
auto foo(){
variant_t var;
if (condition1){
var = MyObj1{"A String"};
// Other stuff
} else if (condition2) {
var = MyObj2{123, 12345};
// Other stuff
} else if (condition3) {
var = MyObj3{SomeObject};
// Other stuff
} else {
throw std::runtime_error{};
}
return var;
}
int main(){
auto var = foo();
std::visit([&](auto& v){v.call_shared_function_name();}, var);
}
假设所有的 MyObj 都是不平凡的,有没有办法让它工作?
我知道 std::monostate 将允许您以这种方式初始化变体并在以后实际填充它。但是如果我这样做,我就不能在访问者中拥有干净的 auto& lambda,并且必须为每种类型创建一个访问者/lambda。
解决方案
我知道这可能看起来很傻,或者不那么干净,但您实际上需要使用这些对象之一进行初始化:
variant_t var = MyObj1{"A String"};
它编译得很好,如果你不能,请告诉我,我会删除答案
推荐阅读
- scala - Scala - Spark:通用假数据生成器
- apache-beam - Apache Beam - 随机数
- html - 表单错误破坏了内联字段的布局
- java - 如何使用 groovy、java 将电子邮件发送到 Microsoft 直接发送(domain-com.mail.protection.outlook.com)
- bootstrap-4 - 从父组件更改数据后,子组件中的动态选项卡窗格未激活
- grok - 一种查找特定单个字符的方法 - grok 模式
- sql - SQLite 查询问题,以及事务的原子性
- express - 如何使用 EJS 变量获取对象的属性?
- java - 在 Java 中从 GCP 发布/订阅重试消息需要哪些设置
- angular - 在父组件中隐藏子组件