c++ 调用std::variant的泛型方法

prdp8dxp  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(139)

有两个类的方法f()具有相同的名称和签名:

struct A {
    void f() {}
};
struct B {
    void f() {}
};

有没有可能用一个std::variant<A, B> v代替std::visit用一个表达式来调用这个方法?就像v->f()一样?
注意:这个问题是专门关于std::variant的。而不是关于如何在没有它的情况下解决这个特定的任务(例如继承)。

xdyibdwo

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没有文档,它的名字也很糟糕。可读性比快速键入更重要。

相关问题