Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以推迟过载解决?_C++_Templates_Overload Resolution - Fatal编程技术网

C++ 是否可以推迟过载解决?

C++ 是否可以推迟过载解决?,c++,templates,overload-resolution,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

我在试验过载

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);
}

或者这通常是不可能的,因为
foo
未解决

对于重载函数集的名称,您几乎不需要立即解析为一个特定函数(或函数模板专门化),就可以做很多事情。但有一个上下文,其中许多语义检查在某种程度上被“延迟”,即在模板内部。通用lambda是编写模板的快捷方式。因此,我们可以做的一件事是:

#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);
}
#包括
#定义换行符重载(f)[(自动&&…参数){\
返回f(std::forward(args)…;}
int foo(int,int);
int foo(int);
int main(){
自动f=换行重载(foo);
f(1);
f(2,3);
}

尽管需要预处理器
#define
,因为无法表示要调用以传递给模板的函数的名称。(函数指针可以是一个模板参数,也可以帮助推断模板函数参数的类型,但之后您又需要一个特定的重载来使用模板。)

对于重载函数集的名称,您可以做的事情很少,不需要立即解析为一个特定函数(或函数模板专门化)。但在模板内部有一个上下文,其中许多语义检查以某种方式“延迟”。而通用lambda是编写模板的快捷方式。因此,我们可以做的一件事是:

#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);
}
#包括
#定义换行符重载(f)[(自动&&…参数){\
返回f(std::forward(args)…;}
int foo(int,int);
int foo(int);
int main(){
自动f=换行重载(foo);
f(1);
f(2,3);
}

虽然需要预处理器
#define
,因为无法表示要调用以传递到模板的函数的名称。(函数指针可以是模板参数,也可以帮助推断模板函数参数的类型,但接下来您需要一个特定的重载来使用模板。)

接受了你的回答,但我不得不承认我并不完全信服。我刚刚发现第二个示例中的
sigc::slot sl=sigc::ptr_fun1(&foo);
重载了
foo
。它们还写“如果函数指针指向重载类型[…]”正是这样的句子最初让我怀疑
foo
在写完评论后是否在allups有一个类型,我理解了
sigc::ptr_fun1(&foo)
选择了正确的重载。虽然我仍然有点困惑于说
foo
在重载解析之前有一个类型实际上
foo
在重载解析之前没有一个类型。但是在某些情况下,重载函数的名称可以用作函数指针,编译器可以确定上下文中的函数类型:“事实上,foo在重载解析之前没有类型。”这正是我想要的。在阅读你的答案之前,以及在我发现所说的例子接受你的答案之前,不知何故,我无法以更简洁的方式表述这个问题,但我必须承认,我并不完全相信。我只是找到了第二个例子中的
sigc::slot sl=sigc::ptr\u fun1(&foo)
foo
重载。他们还写“如果函数指针指向重载类型[…]”,正是这样的句子最初让我想知道
foo
是否在allups有一个类型,就在写完注释后,我理解了
sigc::ptr_fun1(&foo)
选择了正确的重载。虽然我仍然有点困惑于说
foo
在重载解析之前有一个类型实际上
foo
在重载解析之前没有一个类型。但是在某些情况下,重载函数的名称可以用作函数指针,编译器可以确定上下文中的函数类型:“事实上,在重载解析之前,foo没有类型。”这正是我想要的。在阅读你的答案之前,在我找到上述示例之前,不知何故,我无法以更简洁的方式表述问题