首页 > 解决方案 > 如何将 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。

标签: c++17variantvisitor-pattern

解决方案


我知道这可能看起来很傻,或者不那么干净,但您实际上需要使用这些对象之一进行初始化:

variant_t var = MyObj1{"A String"};

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


推荐阅读