考虑到这个委托类:
template <class DELEGATECLASS, class METHODPTRSPEC>
class CLDelegate
{
public:
CLDelegate();
CLDelegate( DELEGATECLASS* instancePtr, METHODPTRSPEC methodPtr );
CLDelegate( const CLDelegate& rhs );
DELEGATECLASS* pInstance_;
METHODPTRSPEC pMethod_;
};
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate()
: pInstance_( nullptr )
, pMethod_( nullptr )
{}
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate( DELEGATECLASS*
instancePtr, METHODPTRSPEC methodPtr )
: pInstance_( instancePtr )
, pMethod_( methodPtr )
{}
//-----------------------------------------------------------------------------
//
template <class DELEGATECLASS, class METHODPTRSPEC>
CLDelegate<DELEGATECLASS, METHODPTRSPEC>::CLDelegate( const CLDelegate& rhs )
: pInstance_( rhs.pInstance_ )
, pMethod_( rhs.pMethod_ )
{}我想在另一个类中使用这个委托,但是我必须为整个类设置模板参数,我不想这样做:
template<class DELEGATECLASS, class METHODPTR>
class SomeClass
{
public:
IOVFUCam();
~IOVFUCam();
// Data Members
private:
...
const CLDelegate<DELEGATECLASS, METHODPTR>& del_;
};由于我不想在整个类上使用模板参数,所以我想知道在我的类中是否可能有一个虚拟委托并更改它的类型(在编译时?):
struct EmptyType
{};
class SomeClass
{
public:
template<class DELEGATECLASS, class METHODPTR>
IOVFUCam( CLDelegate<DELEGATECLASS, METHODPTR> del )
: del_(del)
{};
~IOVFUCam();
// Data Members
private:
...
const CLDelegate<EmptyType, EmptyType>& del_;
};
FrameHandler handler;
CLDelegate<FrameHandler,
void(FrameHandler::*)( IOBuffer::Ptr )>
del( &handler, &FrameHandler::ProcessImage );
SomeClass obj( del );我很快地读到了Alexandrescu写的关于TypeTraits的东西,我想知道这是否可以应用到我的问题上,或者其他的技巧上?
非常感谢!
发布于 2013-08-11 16:50:41
你见过std::分配器吗?它有一个“rebind”类型,它允许std::allocator在编译时为您提供一个std::allocator。
template <class DELEGATECLASS, class METHODPTRSPEC>
class CLDelegate
{
public:
template<class D, class M>
struct rebind {
typedef CLDelegate<D, M> type;
};
CLDelegate();
CLDelegate( DELEGATECLASS* instancePtr, METHODPTRSPEC methodPtr );
CLDelegate( const CLDelegate& rhs );
DELEGATECLASS* pInstance_;
METHODPTRSPEC pMethod_;
};这样,如果已经具有CLDelegate类型,则可以使用以下代码获得不同的CLDelegate类型。
typename MyDelType::rebind<NewDel, NewSpec>::type这就是你要找的吗?
https://stackoverflow.com/questions/18171913
复制相似问题