gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:28:48 31 4
gpt4 key购买 nike

考虑这个委托(delegate)类:

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_ )
{}

我想在另一个类中使用这个委托(delegate),但我必须为整个类设置模板参数,这是我不想要的,如下所示:

template<class DELEGATECLASS, class METHODPTR>
class SomeClass
{
public:
IOVFUCam();
~IOVFUCam();

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

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

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::allocator 吗?它有一个“重新绑定(bind)”类型,允许 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 类型,则可以使用以下代码获取不同的 CLDegate 类型。

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

这就是你要找的吗?

关于c++ - 使用模板更改类型的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18171913/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com