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?(那么所有可能的语法是什么,如果有的话)最好的方法是手动创建过载集。
#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根据需要/预期调用采用 的重载。
请注意,这并不完全等同于直接传递预期函数(值得注意的例外包括按值获取不可移动类型对象的函数),但这是无需显式手动类型选择即可实现的最佳方法。