我如何使用std::variant与非平凡的用户对象(在以后构建),并让访问者使用自动lambda?

问题描述 投票:0回答:1

我的代码是这样的。

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 visitor
1个回答
0
投票

我知道这可能看起来很傻,或者不那么干净,但实际上你需要用其中一个对象进行初始化。

variant_t var = MyObj1{"A String"};

而且编译得很好, 如果你不能, 请告诉我, 我会把答案删掉的

© www.soinside.com 2019 - 2024. All rights reserved.