模板函数,用于在模板化对象上执行成员回调,而无需提供其实例
Template function to execute member callback on templated object without providing it's instance
一些上下文...
- 我有一张包含对象向量作为值的地图。
- 每个向量都包含专用类型的对象。
- 映射的键是表示每种类型的枚举的值,
EnumObjType
- 我收到包含
EnumObjType
和ObjID
的事件。
我正在尝试构建一个模板函数来处理任何类型的对象,我面临的挑战是这些对象 ID 是使用专用类的方法访问的。为了解决这个问题,我正在尝试向我的模板函数添加一个参数,该参数将是调用以获取SpecializedObj
的 ID 的函数。
模板函数调用如下所示:
bool processEvent<SpecializedObj>(iEvent, iObjMap, &SpecializedObj::getSpecializedId);
定义 :
template<typename ObjType>
bool processEvent(MyEvent* iEvent, ObjMap* iObjMap, std::function<unsigned int(void)> iObjIdCall)
{
// Reach the corresponding ObjType vector
ObjMap::iterator it = iObjMap->find(iEvent->getObjType());
std::vector<BaseObject*> wObjVector = it->second;
// Iterate over the vector's range
for(BaseObject* wBaseObjPtr : wObjVector)
{
// Cast into SpecializedObj
ObjType* wSpecializedObjPtr = dynamic_cast<ObjType*>(wBaseObjPtr);
// Test dynamic_cast result
if(!wSpecializedObjPtr) {return false;}
std::function<unsigned int(void)> callback = std::bind(iObjIdCall,*wSpecializedObjPtr);
// Check if the SpecializedObjPtr's ID matches the event's DeviceId
if(callback() != iEvent->getDeviceId()) {return false;}
// work on SpecializedObj
// ...
return true
}
在我眼中相当神秘的错误之下:
11>C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(514) : error C2664: 'std::_Func_class<_Ret>::_Set' : cannot convert parameter 1 from '_Myimpl *' to 'std::_Func_base<_Rx> *'
11> with
11> [
11> _Ret=const unsigned int
11> ]
11> and
11> [
11> _Rx=const unsigned int
11> ]
11> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Do_alloc<_Myimpl,_Fret(__thiscall SpecializedObj::* const &)(void) const,_Alloc>(_Fty,_Alloc)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int,
11> _Alloc=std::allocator<std::_Func_class<const unsigned int>>,
11> _Fty=const unsigned int (__thiscall SpecializedObj::* const &)(void) const
11> ]
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Do_alloc<_Myimpl,_Fret(__thiscall SpecializedObj::* const &)(void) const,_Alloc>(_Fty,_Alloc)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int,
11> _Alloc=std::allocator<std::_Func_class<const unsigned int>>,
11> _Fty=const unsigned int (__thiscall SpecializedObj::* const &)(void) const
11> ]
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset_alloc<_Fret,SpecializedObj,std::allocator<_Ty>>(_Fret (__thiscall SpecializedObj::* const )(void) const,_Alloc)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int,
11> _Ty=std::_Func_class<const unsigned int>,
11> _Alloc=std::allocator<std::_Func_class<const unsigned int>>
11> ]
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(514) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset_alloc<_Fret,SpecializedObj,std::allocator<_Ty>>(_Fret (__thiscall SpecializedObj::* const )(void) const,_Alloc)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int,
11> _Ty=std::_Func_class<const unsigned int>,
11> _Alloc=std::allocator<std::_Func_class<const unsigned int>>
11> ]
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset<const unsigned int,SpecializedObj>(_Fret (__thiscall SpecializedObj::* const )(void) const)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int
11> ]
11> C:Program Files (x86)Microsoft Visual Studio 11.0VCincludefunctional(675) : see reference to function template instantiation 'void std::_Func_class<_Ret>::_Reset<const unsigned int,SpecializedObj>(_Fret (__thiscall SpecializedObj::* const )(void) const)' being compiled
11> with
11> [
11> _Ret=const unsigned int,
11> _Fret=const unsigned int
11> ]
11> C:MyProjectObjUpdater.cpp(29) : see reference to function template instantiation 'std::function<_Fty>::function<const unsigned int(__thiscall SpecializedObj::* )(void) const>(_Fx &&)' being compiled
11> with
11> [
11> _Fty=const unsigned int (void),
11> _Fx=const unsigned int (__thiscall SpecializedObj::* )(void) const
11> ]
11> C:MyProjectObjUpdater.cpp(29) : see reference to function template instantiation 'std::function<_Fty>::function<const unsigned int(__thiscall SpecializedObj::* )(void) const>(_Fx &&)' being compiled
11> with
11> [
11> _Fty=const unsigned int (void),
11> _Fx=const unsigned int (__thiscall SpecializedObj::* )(void) const
11> ]
当我以前使用回调时,我总是知道它将与哪个对象实例相关联,所以我会将其作为函数参数传递给std::bind(&Foo::func, fooObj)
但它似乎在这里不适合我。
编辑: 我正在使用 Visual Studio 2012 v110 工具集
当我以前使用回调时,我总是知道它将与哪个对象实例相关联,所以我会将其作为函数参数传递给
std::bind(&Foo::func, fooObj)
但它似乎在这里对我不起作用。
如果processEvent()
接收iObjIdCall
作为std::function<unsigned int(void)>
,则当您尝试绑定它并保存std::bind()
时,结果为相同类型的对象
std::function<unsigned int(void)> callback
= std::bind(iObjIdCall,*wSpecializedObjPtr);
你混淆了编译器。
尝试将processEvent()
定义为接收指向方法的指针而不是std::function
;例如
template <typename ObjType>
bool processEvent (MyEvent* iEvent, ObjMap* iObjMap, ObjType::*iObjIdCall)
如果我没记错的话。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 为什么可以在没有实例变量的情况下访问静态回调方法中的静态成员变量?
- 模板函数,用于在模板化对象上执行成员回调,而无需提供其实例
- 如何使用 boost::bind 将类/结构实例作为参数传递给回调
- 从本机C++类的实例回调到C++/CX ref类的最佳方法是什么
- 回调方法无法访问成员变量或实例
- 将C++实例方法与C回调函数混合使用
- 在DLL实例之间的exe中使用回调
- 回调需要const函数,如何传递对象的实例成员
- OO设计:多个实例但是静态回调
- 将此实例作为回调参数发送
- 从回调函数访问实例
- 如何将实例成员函数作为回调传递给 std::thread