我没有完全理解变体的用法,也许有人可以弄清楚我做错了什么(可能是我的方法)。
让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;
这是我使用变体的方法:
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;
}
工会更有效吗?
union
{
a _a;
b _b;
} variant;
byte variant_id = 0;
最佳答案
尽量不要查询变量的类型。如果这样做,您的代码本质上等效于if链中的一堆动态转换,即代码气味。
而是让变体为您调度。而且,如果要访问base
和a
的公共(public)b
,则不需要该变体中的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);
}
关于c++ - std::具有相同基类的类的变体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53166321/