传递一个自由函数来调用?

Vin*_*ent 2 c++ overloading function parameter-passing c++17

考虑以下代码:

void f(int) {std::cout << "void f(int)" << std::endl;}
void f(double) {std::cout << "void f(double)" << std::endl;}
void f(int*) {std::cout << "void f(int*)" << std::endl;}
std::invoke(f, 3);
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  • 使用自由函数(不是函子),是否可以传递整个重载集f并让invoke选择正确的一个?(没有任何辅助类,这是一个纯粹的语言问题)
  • 如果不可能那么如何传递void f(int)invoke?(那么所有可能的语法是什么,如果有的话)

Bar*_*rry 5

最好的方法是手动创建过载集。

#define OVERLOADS_OF(name) [&](auto&&... args) -> decltype(name(FWD(args)...)) noexcept(noexcept(name(FWD(args)...))) { return name(FWD(args)...); }
Run Code Online (Sandbox Code Playgroud)

然后将其传入:

invoke(OVERLOADS_OF(f), 3)
Run Code Online (Sandbox Code Playgroud)

这样,编译器仍然为我们执行重载解析 - 我们不必自己执行此操作 - 并且int根据需要/预期调用采用 的重载。

请注意,这并不完全等同于直接传递预期函数(值得注意的例外包括按值获取不可移动类型对象的函数),但这是无需显式手动类型选择即可实现的最佳方法。