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

初学模板,小弟我认为这段仿函数是否有有关问题,们进来瞅瞅呢

2012-02-27 
初学模板,我认为这段仿函数是否有问题,大虾们进来瞅瞅呢我们老大写了一段代码,其中有个遍历的函数使用到了

初学模板,我认为这段仿函数是否有问题,大虾们进来瞅瞅呢
我们老大写了一段代码,其中有个遍历的函数使用到了回调函数(我认为是),但他又使用到了类似于仿函数的代码,大概代码如下:
interface   SharedMemoryCache
{
        typedef   BOOL   (   CALLBACK   *TCB   )(   LPVOID   key,   LPVOID   element,   LPVOID   argment   );
        virtual   void   Traverse(   TCB   fn,   LPVOID   argment   )   =   0;
};

//   包装后的应用模版类
template   <   typename   _type,   DWORD   count   >
class   ObjectCache
{
        template   <   typename   _functor   >   void   Traverse(   _functor   &functor   )  
        {  
                cache.Traverse(   TCB_Functor <   void   > ::GetFunctor(   &functor   ),   (   LPVOID   )&functor   );  
        }
private:
        template   <   typename   _functor   >
        struct   TCB_Functor  
        {
                template   <   typename   _functor   >   static   SharedMemoryCache::TCB  
                        GetFunctor(   _functor   functor   )   {   return   TCB_Functor <   _functor   > ::TCB_Call;   }

                static   BOOL   CALLBACK   TCB_Call(   LPVOID   key,   LPVOID   element,   LPVOID   argment   )
                {
                        return   (   *reinterpret_cast <   _functor   > (   argment   )   )
                                (   reinterpret_cast <   LPCSTR   > (   key   ),   reinterpret_cast <   _type&   > (   *(   LPBYTE   )element   )   );
                };
        };

        SharedMemoryCache   &cache;
};

在他的应用中,写了一个类似于下面的代码
struct   SFunctor
{
        BOOL   operator()(...){}
}
这一段应该是仿函数的典型写法,但我从上面代码的分析认为,实际上根本就没用到仿函数(或者说仿函数的性能优势被抛弃了,甚至比本身回调机制的性能可能还要慢),而且TCB_Functor::GetFunctor这个静态模板函数的模板我认为是多余的,抛开这个不说,我认为:最终传递给Travers函数的TCB   fn,其实就是TCB_Functor <void> ::TCB_Call,而对于Travers来说,他就只是一个模板实例化后的函数地址……一个中规中矩的TCB类型函数指针,而且在TCB_Functor <void> ::TCB_Call函数中还要再进行一次函数指针调用,这样一来,如果直接使用函数指针回调只需要一次的间接调用,现在变成了2次间接掉用。

现在看来,这段代码只是对于使用者来说,看起来象是使用了仿函数,但实际上并不是,正如他的调用
SFunctor   f;
ObjectCache <Sfoo> ::Traverse(f);

我的大体想法是这样,不知道是否正确,希望各位大大为小弟指点一下,万分感谢

[解决办法]
的确,本来很简单的代码写的很复杂
还是使用的函数指针.
[解决办法]
我们老大写了一段代码
------------------
hehe

热点排行