我正在尝试重载
int foo(int,int);
int foo(int);
int main() {
//decltype(foo) x; // error: reference to overloaded function could not be resolved;
decltype(foo(1)) f;
}
我知道除非选择重载之一,否则无法获得指向foo
的指针,但是我想知道为什么重载集没有类型?会写自然吗
template <typename F>
void foofoo(F f,bool x) {
if (x) f(1);
else f(1,0);
}
并将其称为foofoo(foo,true);
吗?我知道有多种写类似方法的方法,但是我特别想知道重载集。无论如何,我的问题是
在选择其中一个重载之前,可以对重载设置执行任何操作吗?
换句话说,是否有一些magic
可以照原样制作以下true
?
std::is_same_v< decltype( foo(1,1) ), magic<foo,int,int>::type >;
还是由于foo
尚未解决而通常不可能吗?
答案 0 :(得分:5)
使用重载函数集的名称可以执行的操作很少,不需要立即解析为一个特定函数(或函数模板专门化)。但是,其中许多语义检查以某种方式“延迟”的上下文是在模板内部。通用lambda是编写模板的快捷方式。因此,我们可以做的一件事是:
TypeDescriptor.GetConverter(typeof(Foo))
尽管需要预处理器#include <utility>
#define WRAP_OVERLOADS(f) [](auto&& ...args) { \
return f(std::forward<decltype(args)>(args)...); }
int foo(int, int);
int foo(int);
int main() {
auto f = WRAP_OVERLOADS(foo);
f(1);
f(2,3);
}
,因为无法表示要传递给模板的调用函数的名称。 (函数指针可以是模板参数,也可以帮助推断模板函数参数的类型,但随后又需要特定的重载来使用模板。)