首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改类型的模板的解决方案

更改类型的模板的解决方案
EN

Stack Overflow用户
提问于 2013-08-11 12:30:16
回答 1查看 77关注 0票数 0

考虑到这个委托类:

代码语言:javascript
复制
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_ )
{}

我想在另一个类中使用这个委托,但是我必须为整个类设置模板参数,我不想这样做:

代码语言:javascript
复制
template<class DELEGATECLASS, class METHODPTR>
class SomeClass
{
public:
    IOVFUCam();
    ~IOVFUCam();

    // Data Members
private:
    ...
    const CLDelegate<DELEGATECLASS, METHODPTR>& del_;
};

由于我不想在整个类上使用模板参数,所以我想知道在我的类中是否可能有一个虚拟委托并更改它的类型(在编译时?):

代码语言:javascript
复制
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的东西,我想知道这是否可以应用到我的问题上,或者其他的技巧上?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-11 16:50:41

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

代码语言:javascript
复制
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类型。

代码语言:javascript
复制
typename MyDelType::rebind<NewDel, NewSpec>::type

这就是你要找的吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18171913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档