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;
}
函数要加一个函数指针参数,把指向的函数在中间标注处运行
为了通用,要求该指针指的函数的返回值为所有类型,参数也是可变的,
求教要怎么写
11 个解决方案
#1
其实,函数指针作为参数,就是相当于其返回值作为参数,个人是这样理解的!
#2
显然不是楼上说这样,函数内部可以通过该调用那个函数
如果针对某一特定类型的函数试验成功了,但如果想写成支持各种类型的参数和返回的不太会写
求高手指点
如果针对某一特定类型的函数试验成功了,但如果想写成支持各种类型的参数和返回的不太会写
求高手指点
#3
求高手指点!
#4
没人来看?
#5
template<class _Result,class Arg>
_Result Pred(Arg arg);
_Result Pred(Arg arg);
#6
回调么?
最简单的是参数reinterpret_cast成void(*)()啥的,调用的时候reinterpret_cast回来。不过类型安全完全自己把握。
要么就直接上C++11的std::function啥的好了。不过也不是任意类型,因为回调接口的静态类型是得你自己确定的。
真正要“任意”,恐怕得把get_time写成variadic template了。这其实不太合算(重复生成很多没必要的东西)。如果是我的话会把这段代码拆成两个,写在一个struct的构造函数和析构函数里面用来当scope guard,在要统计的地方加上block,定义一个这样的对象然后就万事大吉了。
最简单的是参数reinterpret_cast成void(*)()啥的,调用的时候reinterpret_cast回来。不过类型安全完全自己把握。
要么就直接上C++11的std::function啥的好了。不过也不是任意类型,因为回调接口的静态类型是得你自己确定的。
真正要“任意”,恐怕得把get_time写成variadic template了。这其实不太合算(重复生成很多没必要的东西)。如果是我的话会把这段代码拆成两个,写在一个struct的构造函数和析构函数里面用来当scope guard,在要统计的地方加上block,定义一个这样的对象然后就万事大吉了。
#7
突然想起有实际上我在用的……
不过最近比较懒还没封装成scope guard……
封装一下大概是类似这样的:
用的时候:
//...
::LARGE_INTEGER liFrequency;
::LARGE_INTEGER liStart;
::LARGE_INTEGER liEnd;
void
StartClock()
{
::QueryPerformanceFrequency(&liFrequency);
::QueryPerformanceCounter(&liStart);
}
void
EndClock()
{
::QueryPerformanceCounter(&liEnd);
std::printf("Painted performed in: %f milliseconds.\n",
double(1000 * 1.0 / liFrequency.QuadPart
* (liEnd.QuadPart - liStart.QuadPart)));
}
不过最近比较懒还没封装成scope guard……
封装一下大概是类似这样的:
struct Counter
{
::LARGE_INTEGER liFrequency;
::LARGE_INTEGER liStart;
::LARGE_INTEGER liEnd;
Counter()
{
//StartClock();
}
~Counter()
{
//EndClock();
}
};
用的时候:
//...
{
Counter counter;
//xxoo to be counted;
}
#8
按楼主的描述,则函数必须定义成这样的:
void* function_name(string param1, ...);
void* function_name(string param1, ...);
#9
补充:处理可变参数"..."类型稍微有些繁琐,参考一下函数的手动调用吧,主要就是如何手动实现参数的入栈和出栈,我记得VC中似乎有这样的宏。
#10
另外,如果觉得void*很丑且不安全,可以考虑用boost库的any类型。
#11
谢谢各位,不过基础还不是很好,现在看还是有点吃力,先标记了以后再看
#1
其实,函数指针作为参数,就是相当于其返回值作为参数,个人是这样理解的!
#2
显然不是楼上说这样,函数内部可以通过该调用那个函数
如果针对某一特定类型的函数试验成功了,但如果想写成支持各种类型的参数和返回的不太会写
求高手指点
如果针对某一特定类型的函数试验成功了,但如果想写成支持各种类型的参数和返回的不太会写
求高手指点
#3
求高手指点!
#4
没人来看?
#5
template<class _Result,class Arg>
_Result Pred(Arg arg);
_Result Pred(Arg arg);
#6
回调么?
最简单的是参数reinterpret_cast成void(*)()啥的,调用的时候reinterpret_cast回来。不过类型安全完全自己把握。
要么就直接上C++11的std::function啥的好了。不过也不是任意类型,因为回调接口的静态类型是得你自己确定的。
真正要“任意”,恐怕得把get_time写成variadic template了。这其实不太合算(重复生成很多没必要的东西)。如果是我的话会把这段代码拆成两个,写在一个struct的构造函数和析构函数里面用来当scope guard,在要统计的地方加上block,定义一个这样的对象然后就万事大吉了。
最简单的是参数reinterpret_cast成void(*)()啥的,调用的时候reinterpret_cast回来。不过类型安全完全自己把握。
要么就直接上C++11的std::function啥的好了。不过也不是任意类型,因为回调接口的静态类型是得你自己确定的。
真正要“任意”,恐怕得把get_time写成variadic template了。这其实不太合算(重复生成很多没必要的东西)。如果是我的话会把这段代码拆成两个,写在一个struct的构造函数和析构函数里面用来当scope guard,在要统计的地方加上block,定义一个这样的对象然后就万事大吉了。
#7
突然想起有实际上我在用的……
不过最近比较懒还没封装成scope guard……
封装一下大概是类似这样的:
用的时候:
//...
::LARGE_INTEGER liFrequency;
::LARGE_INTEGER liStart;
::LARGE_INTEGER liEnd;
void
StartClock()
{
::QueryPerformanceFrequency(&liFrequency);
::QueryPerformanceCounter(&liStart);
}
void
EndClock()
{
::QueryPerformanceCounter(&liEnd);
std::printf("Painted performed in: %f milliseconds.\n",
double(1000 * 1.0 / liFrequency.QuadPart
* (liEnd.QuadPart - liStart.QuadPart)));
}
不过最近比较懒还没封装成scope guard……
封装一下大概是类似这样的:
struct Counter
{
::LARGE_INTEGER liFrequency;
::LARGE_INTEGER liStart;
::LARGE_INTEGER liEnd;
Counter()
{
//StartClock();
}
~Counter()
{
//EndClock();
}
};
用的时候:
//...
{
Counter counter;
//xxoo to be counted;
}
#8
按楼主的描述,则函数必须定义成这样的:
void* function_name(string param1, ...);
void* function_name(string param1, ...);
#9
补充:处理可变参数"..."类型稍微有些繁琐,参考一下函数的手动调用吧,主要就是如何手动实现参数的入栈和出栈,我记得VC中似乎有这样的宏。
#10
另外,如果觉得void*很丑且不安全,可以考虑用boost库的any类型。
#11
谢谢各位,不过基础还不是很好,现在看还是有点吃力,先标记了以后再看