读书人

初学模板小弟我认为这段仿函数是否有

发布时间: 2012-02-27 10:00:22 作者: rapoo

初学模板,我认为这段仿函数是否有问题,大虾们进来瞅瞅呢
我们老大写了一段代码,其中有个遍历的函数使用到了回调函数(我认为是),但他又使用到了类似于仿函数的代码,大概代码如下:
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

读书人网 >C++

热点推荐