Обходной путь с шаблонами для изменения типа
Учитывая этот класс делегата:
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
Это то, что вы искали?