使用模板更改类型的解决方法
A workaround with templates for changing a type
考虑这个委托类:
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
这就是你想要的吗?
相关文章:
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- Eclipse/CDT_C++给出"语义错误_"类型XXX无法解决"。项目运行
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- "class":非法使用此类型作为表达式 如何解决?
- 表达式必须具有类类型。不知道怎么解决
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 对前向声明类型进行unique_ptr的解决方法
- 必须使用尾随返回类型的示例,因为无法用旧方法解决问题
- 类型长的长度和未解决的超载函数类型的类型的操作数与二进制运算符
- 清.如何生成具有不同库类型的Visual Studo解决方案?
- 错误:"某个类"未命名类型。如何解决这个问题?
- dlsym() 解决方法返回类型
- 在 C++14 中,是否有一种优雅的解决方案可以在可变参数模板中选择可调用和不可调用的类型
- 我将类型库(.tlb)导入到Delphi中,但函数参数似乎不正确.我应该如何解决它
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 任何解决此类型扣除的方法
- 我的头文件中的错误 - 错误:"QSMatrix"没有命名类型,如何解决此问题?
- 为什么 GCC 不能使用声明为正确的类型解决此问题
- 用于"types"点的强类型解决方案