有没有一种干净的方法可以将重载集转换为适合与 std::visit 一起使用的访问者?

Dan*_*ury 3 c++ variant c++17

假设我有一个重载集,如下所示:

class C
{
  public: 

    static void f(const A &);
    static void f(const B &);
};
Run Code Online (Sandbox Code Playgroud)

我想做类似的事情

std::variant<A, B> v;

// ...

std::visit(C::f, v);
Run Code Online (Sandbox Code Playgroud)

但这不能编译。是否有某种方法可以获取重载集并将其视为或将其转换为访问者?

Dan*_*ury 5

事实上,在进一步尝试之后,我意识到我可以做到

std::visit([](const auto & t) { C::f(t); }, v);
Run Code Online (Sandbox Code Playgroud)

所以我将把这个留在这里作为其他有同样问题的人的潜在解决方案。

  • 您可以通过完美转发来改进它:`[](auto&amp;&amp; arg){ C::f(std::forward&lt;decltype(arg)&gt;(arg));}`。除此之外,我相信这是最干净的解决方案,因为过载集根本无法传递。 (2认同)