首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数指针作为函数参数有关问题

2012-04-18 
函数指针作为函数参数问题在网上找了一个统计执行某段代码所需时间的方法,想写成函数,设计后的代码如下:C/

函数指针作为函数参数问题
在网上找了一个统计执行某段代码所需时间的方法,想写成函数,设计后的代码如下:

C/C++ code
double get_time() //参数表要为一个函数指针{    LARGE_INTEGER litmp;     LONGLONG QPart1,QPart2;    double dfMinus, dfFreq, dfTim;    QueryPerformanceFrequency(&litmp);    dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率    QueryPerformanceCounter(&litmp);    QPart1 = litmp.QuadPart;// 获得初始值    /*******       统计部分代码(这里运行函数指针指向的函数)    *******/    do    {        QueryPerformanceCounter(&litmp);        QPart2 = litmp.QuadPart;//获得中止值        dfMinus = (double)(QPart2-QPart1);        dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒    }while(dfTim<0.000001);     return dfTim;}


函数要加一个函数指针参数,把指向的函数在中间标注处运行
为了通用,要求该指针指的函数的返回值为所有类型,参数也是可变的,
求教要怎么写

[解决办法]
回调么?
最简单的是参数reinterpret_cast成void(*)()啥的,调用的时候reinterpret_cast回来。不过类型安全完全自己把握。
要么就直接上C++11的std::function啥的好了。不过也不是任意类型,因为回调接口的静态类型是得你自己确定的。
真正要“任意”,恐怕得把get_time写成variadic template了。这其实不太合算(重复生成很多没必要的东西)。如果是我的话会把这段代码拆成两个,写在一个struct的构造函数和析构函数里面用来当scope guard,在要统计的地方加上block,定义一个这样的对象然后就万事大吉了。

[解决办法]
突然想起有实际上我在用的……
C/C++ code
::LARGE_INTEGER liFrequency;::LARGE_INTEGER liStart;::LARGE_INTEGER liEnd;voidStartClock(){    ::QueryPerformanceFrequency(&liFrequency);    ::QueryPerformanceCounter(&liStart);}voidEndClock(){    ::QueryPerformanceCounter(&liEnd);    std::printf("Painted performed in: %f milliseconds.\n",        double(1000 * 1.0 / liFrequency.QuadPart        * (liEnd.QuadPart - liStart.QuadPart)));}
[解决办法]
按楼主的描述,则函数必须定义成这样的:

void* function_name(string param1, ...);
[解决办法]
另外,如果觉得void*很丑且不安全,可以考虑用boost库的any类型。

热点排行