是否可以推迟过载解析?

时间:2018-12-14 00:08:26

标签: c++ templates overload-resolution

我正在尝试重载

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尚未解决而通常不可能吗?

1 个答案:

答案 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); } ,因为无法表示要传递给模板的调用函数的名称。 (函数指针可以是模板参数,也可以帮助推断模板函数参数的类型,但随后又需要特定的重载来使用模板。)