有两个类的方法f()具有相同的名称和签名:
f()
struct A { void f() {} }; struct B { void f() {} };
有没有可能用一个std::variant<A, B> v代替std::visit用一个表达式来调用这个方法?就像v->f()一样?注意:这个问题是专门关于std::variant的。而不是关于如何在没有它的情况下解决这个特定的任务(例如继承)。
std::variant<A, B> v
std::visit
v->f()
std::variant
xdyibdwo1#
你似乎在担心你必须输入的字符数。最小化输入并不是语言的设计目标。std::visit是你想要做的事情的方法。因为这是一种方法,所以没有理由提供一种不同的方法来达到同样的效果。如果你想用更少的输入来达到同样的效果,你可以写一个自定义函数:
void f(auto& v) { std::visit( [](auto& x) { x.f(); },v ); }
然后你可以通过f(v);调用它。它不完全是你想要的v->f();,但实际上它需要键入的字符更少。PS:如果这是代码高尔夫,我想让你参考我写的https://codegolf.stackexchange.com/a/251154/114229的这个答案,它讨论了添加一些代码以缩短某些表达式之间的权衡(答案是专门关于使用#define的,但同样的考虑也适用于编写函数)。PPS:如果这不是代码高尔夫,我想提醒你代码只写一次,但读很多次。每个人都可以读std::visit(...),有很多关于它如何工作和它做什么的文档。上面的函数f没有文档,它的名字也很糟糕。可读性比快速键入更重要。
f(v);
v->f();
#define
std::visit(...)
f
1条答案
按热度按时间xdyibdwo1#
你似乎在担心你必须输入的字符数。最小化输入并不是语言的设计目标。
std::visit
是你想要做的事情的方法。因为这是一种方法,所以没有理由提供一种不同的方法来达到同样的效果。如果你想用更少的输入来达到同样的效果,你可以写一个自定义函数:
然后你可以通过
f(v);
调用它。它不完全是你想要的v->f();
,但实际上它需要键入的字符更少。PS:如果这是代码高尔夫,我想让你参考我写的https://codegolf.stackexchange.com/a/251154/114229的这个答案,它讨论了添加一些代码以缩短某些表达式之间的权衡(答案是专门关于使用
#define
的,但同样的考虑也适用于编写函数)。PPS:如果这不是代码高尔夫,我想提醒你代码只写一次,但读很多次。每个人都可以读
std::visit(...)
,有很多关于它如何工作和它做什么的文档。上面的函数f
没有文档,它的名字也很糟糕。可读性比快速键入更重要。