我的代码是这样的。
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可以让你以这种方式初始化变量,并且...。其实 之后再填充它。但如果我这样做,我就不能在visitor中拥有干净的auto&lambda,而必须为每个类型创建一个visitorlambda。
我知道这可能看起来很傻,或者不那么干净,但实际上你需要用其中一个对象进行初始化。
variant_t var = MyObj1{"A String"};
而且编译得很好, 如果你不能, 请告诉我, 我会把答案删掉的