none
请问函数模板怎么对非托管对象的各个方法进行多样化? RRS feed

  • 问题

  • 我要调用一个非托管对象的很多方法,每个方法都有可能因为网络的关系而失败,这种情况一般需要等一秒钟再重试就可以了。
    重试的代码显示如下:

      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(函数地址,调用参数)
    但是用模拟做就不知道怎么做了,也不知道怎么做。 因为模板是对类型的多样话,我不知道非托管函数的指针怎么多样话 -_-

    请帮下我,谢谢

    2011年8月17日 2:53

答案

  • 模板函数不能作为函数指针。不过你可以把模板函数包装成模板类的成员函数(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)                 
      {                                          
         //显示错误                                  \  }


    麻烦把正确答案设为解答。
    2011年8月17日 3:14
    版主
  • 没关系,你想把一下这段做成一个函数吧?

    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不是很熟悉,写这样的实现比较困难。等我有空给你写一个吧。。。

     


    麻烦把正确答案设为解答。
    2011年8月17日 6:46
    版主
  • http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html
    麻烦把正确答案设为解答。
    • 已标记为答案 bitfish_jzl 2011年8月20日 11:58
    2011年8月18日 3:28
    版主

全部回复

  • 模板函数不能作为函数指针。不过你可以把模板函数包装成模板类的成员函数(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)                 
      {                                          
         //显示错误                                  \  }


    麻烦把正确答案设为解答。
    2011年8月17日 3:14
    版主
  • 对不起,不太明白,呵呵。

    模板函数不能作为函数指针
    =========
    你说的是非托管对像的函数不能做为模板的参数吗?

    operator不是用于运算符重载的吗?这里是怎么回事呢?
    operator函数体内需要写什么东西吗?

    可能比较菜呵呵,能再讲详细一点吗?

    2011年8月17日 6:00
  • 没关系,你想把一下这段做成一个函数吧?

    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不是很熟悉,写这样的实现比较困难。等我有空给你写一个吧。。。

     


    麻烦把正确答案设为解答。
    2011年8月17日 6:46
    版主
  • 对的,我对模板不是很熟悉 -_-

    您可以的话,就给我写一个小SampleCode。 或者推荐哪里有讲这个的书。

    我只了解类可以做为模板参数,但是建个类包括一个函数,这个确实不太明白。  

    谢谢了。 

    我上网用找了,感觉没找到这方面的资料,会再找的。

    2011年8月17日 7:10
  • 先把你的回复设为答案,等你有时间帮我写个SampleCode吧,我把那个SampleCode也设为答案。

    谢谢了,呵呵

    2011年8月17日 7:18
  • http://www.cppblog.com/walkspeed/archive/2007/07/18/28272.html
    麻烦把正确答案设为解答。
    • 已标记为答案 bitfish_jzl 2011年8月20日 11:58
    2011年8月18日 3:28
    版主