积极答复者
请问函数模板怎么对非托管对象的各个方法进行多样化?

问题
-
我要调用一个非托管对象的很多方法,每个方法都有可能因为网络的关系而失败,这种情况一般需要等一秒钟再重试就可以了。
重试的代码显示如下:int loop_times=0; for (; loop_times<5 ;loop_times++) { int iResult = pUserApi->DoSomething(调用参数); if ( 0!=iResult ) Sleep(1000); else break; } if (loop_times>=5) { //显示错误 }
但是我有几十个方法需要调用,如果我在调用每个方法时写上这一段相似的代码,这也太难看了。
于是想解决办法,宏替换是可以做的,但是宏替换不好调试:
#define multiCall(method,syncObj) \ int loop_times=0; \ for (;loop_times<SEND_REQ_TIMES;loop_times++) \ { \ int iResult = pUserApi->method(&req, ++iRequestID); \ if ( IsFlowControl(iResult) ) \ Sleep(1000); /*受到流控*/ \ else \ break; \ } \ if (loop_times>=SEND_REQ_TIMES) \ { \ //显示错误 \ }
然后就想用一个函数来实现重试5次的功能:
multiCall(函数地址,调用参数)
但是用模拟做就不知道怎么做了,也不知道怎么做。 因为模板是对类型的多样话,我不知道非托管函数的指针怎么多样话 -_-请帮下我,谢谢
答案
-
模板函数不能作为函数指针。不过你可以把模板函数包装成模板类的成员函数(operator())。然后将这个模板类作为参数传进你的这个函数。
template<class T>
class wrap
{
public:
void operator()
{
}
}
template<class T>
multiCall(T,syncObj)
int loop_times=0;
for (;loop_times<SEND_REQ_TIMES;loop_times++)
{
int iResult = pUserApi->T(&req, ++iRequestID);
if ( IsFlowControl(iResult) )
Sleep(1000); /*受到流控*/
else
break;
}
if (loop_times>=SEND_REQ_TIMES)
{
//显示错误 \ }
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月17日 7:18
-
没关系,你想把一下这段做成一个函数吧?
int loop_times=0;
for (; loop_times<5 ;loop_times++)
{
int iResult = pUserApi->DoSomething(调用参数);
if ( 0!=iResult )
Sleep(1000);
else
break;
}
if (loop_times>=5)
{
//显示错误
}DoSomething是你要泛化的函数。可能函数参数不同,参数个数也不同。对于你要创建的函数来说,他是一个函数指针类型的参数。
所以DoSomething实际上是一个模板函数的函数指针。但是C++不允许将模板函数作为函数指针使用。所以你需要创建一个模板类作为壳,里面的函数则是你要泛化的模板函数指针,
如果你对template不是很熟悉,写这样的实现比较困难。等我有空给你写一个吧。。。
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月17日 7:18
-
http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月20日 11:58
全部回复
-
模板函数不能作为函数指针。不过你可以把模板函数包装成模板类的成员函数(operator())。然后将这个模板类作为参数传进你的这个函数。
template<class T>
class wrap
{
public:
void operator()
{
}
}
template<class T>
multiCall(T,syncObj)
int loop_times=0;
for (;loop_times<SEND_REQ_TIMES;loop_times++)
{
int iResult = pUserApi->T(&req, ++iRequestID);
if ( IsFlowControl(iResult) )
Sleep(1000); /*受到流控*/
else
break;
}
if (loop_times>=SEND_REQ_TIMES)
{
//显示错误 \ }
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月17日 7:18
-
没关系,你想把一下这段做成一个函数吧?
int loop_times=0;
for (; loop_times<5 ;loop_times++)
{
int iResult = pUserApi->DoSomething(调用参数);
if ( 0!=iResult )
Sleep(1000);
else
break;
}
if (loop_times>=5)
{
//显示错误
}DoSomething是你要泛化的函数。可能函数参数不同,参数个数也不同。对于你要创建的函数来说,他是一个函数指针类型的参数。
所以DoSomething实际上是一个模板函数的函数指针。但是C++不允许将模板函数作为函数指针使用。所以你需要创建一个模板类作为壳,里面的函数则是你要泛化的模板函数指针,
如果你对template不是很熟悉,写这样的实现比较困难。等我有空给你写一个吧。。。
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月17日 7:18
-
http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html
麻烦把正确答案设为解答。- 已标记为答案 bitfish_jzl 2011年8月20日 11:58