使用模板更改类型的解决方法

A workaround with templates for changing a type

本文关键字:类型 解决 方法      更新时间:2023-10-16

考虑这个委托类:

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的文章,我想知道这是否可以应用于我的问题,或者其他技术?

非常感谢!

您见过std::分配器吗?它有一个"rebind"类型,允许std::分配器在编译时为您提供一个std::分配器。

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类型,您可以使用以下代码来获得不同的CLDelegade类型。

typename MyDelType::rebind<NewDel, NewSpec>::type

这就是你想要的吗?