Обходной путь с шаблонами для изменения типа

Учитывая этот класс делегата:

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 );

Я быстро прочитал что-то, что Александреску написал о TypeTraits, и мне интересно, может ли это быть применено к моей проблеме, или другой метод?

Большое спасибо!

1 ответ

Решение

Вы видели std::allocator? Он имеет тип '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

Это то, что вы искали?

Другие вопросы по тегам