如何将 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"};

它编译得很好,如果你不能,请告诉我,我会删除答案

最新更新