【发布时间】:2017-09-02 18:22:02
【问题描述】:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void cb(int x)
{
std::cout <<"print inside integer callback : " << x << "\n" ;
}
void cb(float x)
{
std::cout <<"print inside float callback :" << x << "\n" ;
}
void cb(std::string& x)
{
std::cout <<"print inside string callback : " << x << "\n" ;
}
int main()
{
void(*CallbackInt)(void*);
void(*CallbackFloat)(void*);
void(*CallbackString)(void*);
CallbackInt=(void *)cb;
CallbackInt(5);
CallbackFloat=(void *)cb;
CallbackFloat(6.3);
CallbackString=(void *)cb;
CallbackString("John");
return 0;
}
上面是我的代码,它有三个函数,我想创建三个回调,它们将根据它们的参数调用重载函数。 CallbackInt 用于调用 cb 函数,以 int 为参数,其余两个类似。
但是用它编译时会出现如下错误。
function_ptr.cpp: In function ‘int main()’:
function_ptr.cpp:29:21: error: overloaded function with no contextual type information
CallbackInt=(void *)cb;
^~
function_ptr.cpp:30:14: error: invalid conversion from ‘int’ to ‘void*’ [-fpermissive]
CallbackInt(5);
^
function_ptr.cpp:32:23: error: overloaded function with no contextual type information
CallbackFloat=(void *)cb;
^~
function_ptr.cpp:33:18: error: cannot convert ‘double’ to ‘void*’ in argument passing
CallbackFloat(6.3);
^
function_ptr.cpp:35:24: error: overloaded function with no contextual type information
CallbackString=(void *)cb;
^~
function_ptr.cpp:36:24: error: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive]
CallbackString("John");
【问题讨论】:
-
为什么有函数指针参数
void*? -->void(*CallbackInt)(int); -
为什么会有这些演员表? ->
CallbackInt=&cb;(@FilipKočica 修改后) -
最好用重载的
operator ()编写调用包装器。如果您需要将回调存储在单独的变量中,那么您需要正确声明函数指针类型而不是void (void*); -
您在程序中出现了六次
void*,出现次数过多。 -
永远不要写这么糟糕的代码。避免在 C++ 程序中进行 C 风格转换。此外,你们所有的回调都定义不正确。如果它们被正确定义,您将不需要演员表。事实上,大量演员表通常表明代码编写不佳。 阅读专家撰写的 C++ 书籍以正确学习语言。
标签: c++ c++11 function-pointers