std ::具有相同基类的类的变体

Cry*_*Man 2 c++ variant c++17

我不完全理解变体的用法,也许有人可以清理我做错了什么(可能是我的做法).

让variant对象是两个类的_Types,都继承同一个类.

class base
{
public:
    int foo;
};
class a: public base
{
    int bar;
};
class b: public base
{
    float bar;
};

byte variant_id = 0; // 0 for class A, 1 for class B
std::variant< base, a, b > variant;
Run Code Online (Sandbox Code Playgroud)

以下是我使用变体的方法:

void func( )
{
    auto& _variant = std::get< base >( variant ); // ideally would be = variant_id ? std::get< b >( variant ) : std::get< a >( variant )
    _variant.foo = 20;

    if ( variant_id == 1 )
    {
        auto& variant_ = std::get< b >( variant );
        variant_.bar = 20.f;
    }
    else
    {
        auto& variant_ = std::get< a >( variant );
        variant_.bar = 20;
    }
Run Code Online (Sandbox Code Playgroud)

也许工会更有效?

union
{
    a _a;
    b _b;
} variant;
byte variant_id = 0;
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

尽量不要查询变体的类型.如果你这样做,你的代码基本上等同于if链中的一堆动态强制转换,代码味道.

相反,让变体为您调度.如果你想访问共享baseab,你不需要base在该变体成员.

使用访客

std::variant< a, b > var;
void func( )
{
   std::visit([](auto&& v) {
     v.foo = 20; // Both `a` and `b` have a foo, this is well formed.
     v.bar = 20; // Both have a `bar` that can be assigned a 20. This is well formed too
   }, var);
}
Run Code Online (Sandbox Code Playgroud)