实现功能对象绑定而无需使用C 11
implement function object bind without using c++11
我正在尝试实现自己的函数对象类和绑定功能(只需要包含2个参数的成员函数(。我仅限于使用GCC 4.4.6,而C 0x不是一个选项。
我的代码如下。它不会编译。
#pragma once
namespace utils
{
template<class>
class CFunction;
template<class TRet, class Arg1, class Arg2>
class CFunction<TRet(Arg1, Arg2)>
{
public:
typedef TRet (*FuncPtr) (void*, Arg1, Arg2);
void* m_pObj;
FuncPtr m_FuncPtr;
TRet operator()(Arg1 arg1, Arg2 arg2)
{
return m_FuncPtr(arg1, arg2);
}
template <class TObj, TRet (TObj::*TMemFunc)(Arg1, Arg2)>
static CFunction Create(TObj* pObj)
{
CFunction Ret;
Ret.m_pObj = (void*)pObj;
Ret.m_FuncPtr = &Caller<TObj, TMemFunc>;
return Ret;
}
private:
template<class TObj, TRet (TObj::*TMemFunc)(Arg1, Arg2)>
static TRet Caller(void* obj, Arg1 arg1, Arg2 arg2)
{
TObj* pObj = static_cast<TObj*>(obj);
return (pObj->*TMemFunc)(arg1, arg2);
}
};
template<class TRet, class TClass, class Arg1, class Arg2>
CFunction<TRet(Arg1, Arg2)> Bind(TRet (TClass::*func)(Arg1, Arg2), TClass *pObj)
{
return CFunction<TRet(Arg1, Arg2)>::Create<TClass, func>();
}
} // end of namespace utils
编译报告
Functional.h: In function ‘utils::CFunction<TRet(Arg1, Arg2)> utils::Bind(TRet (TClass::*)(Arg1, Arg2), TClass*)’:
Functional.h:48: error: expected primary-expression before ‘,’ token
Functional.h:48: error: expected primary-expression before ‘)’ token
任何人会告诉我代码有什么问题以及如何使其起作用
解决了问题@vittorio和@msalters。我有新的编译错误。
修复代码
#include <iostream>
namespace utils
{
template<class>
class CFunction;
template<class TRet, class Arg1, class Arg2>
class CFunction<TRet(Arg1, Arg2)>
{
public:
typedef TRet (*FuncPtr) (void*, Arg1, Arg2);
void* m_pObj;
FuncPtr m_FuncPtr;
TRet operator()(Arg1 arg1, Arg2 arg2)
{
return m_FuncPtr(m_pObj, arg1, arg2);
}
template <class TObj, TRet (TObj::*TMemFunc)(Arg1, Arg2)>
static CFunction Create(TObj* pObj)
{
CFunction Ret;
Ret.m_pObj = (void*)pObj;
Ret.m_FuncPtr = &Caller<TObj, TMemFunc>;
return Ret;
}
private:
template<class TObj, TRet (TObj::*TMemFunc)(Arg1, Arg2)>
static TRet Caller(void* obj, Arg1 arg1, Arg2 arg2)
{
TObj* pObj = static_cast<TObj*>(obj);
return (pObj->*TMemFunc)(arg1, arg2);
}
};
template<class TRet, class TClass, class Arg1, class Arg2>
CFunction<TRet(Arg1, Arg2)> Bind(TRet (TClass::*func)(Arg1, Arg2), TClass *pObj)
{
return CFunction<TRet(Arg1, Arg2)>::template Create<TClass, func>(pObj);
}
} // end of namespace utils
class TestLogic
{
public:
bool Test(std::string& str, double d) {
std::cout << str << ", " << d << std::endl;
return true;
}
};
int main(int argc, const char **argv) {
TestLogic testObj;
utils::CFunction<bool(std::string&, double)> f = utils::Bind(&TestLogic::Test, &testObj);
std::string str("hello");
f(str, -1.0);
}
新错误:
prog.cc: In function 'utils::CFunction<TRet(Arg1, Arg2)> utils::Bind(TRet (TClass::*)(Arg1, Arg2), TClass*) [with TRet = bool, TClass = TestLogic, Arg1 = std::string&, Arg2 = double]':
prog.cc:59: instantiated from here
prog.cc:43: error: 'func' is not a valid template argument for type 'bool (TestLogic::*)(std::string&, double)'
prog.cc:43: error: it must be a pointer-to-member of the form `&X::Y'
prog.cc:43: error: no matching function for call to 'utils::CFunction<bool(std::string&, double)>::Create(TestLogic*&)'
有人可以帮助我吗?
您可以运行此代码输入链接说明
您需要使用template
关键字作为Bind
中的DiSambiguator:
return CFunction<TRet(Arg1, Arg2)>::template Create<TClass, func>();
// ^~~~~~~~
这是因为Create
是一个因名称,并且编译器不知道您是否试图调用模板函数或将其与TClass
进行比较。有关该主题的更多阅读:在哪里以及为什么要放置"模板"。和" typename"关键字?
相关文章:
- 将带有派生模板的对象传递给接受具有基本模板的对象的功能
- 对象内部对象的重载功能
- 基于不同字段的对象向量的排序功能
- 具有小对象优化功能的智能指针
- 如果在创建对象时创建了 VPTR,那么为什么具有虚拟功能的类的大小在 32 位系统上为 4,在 64 位机器上为 8
- 如何改进我的"String"对象比较功能
- 如何存储指针以功能模板,该模板将可呼叫对象作为其参数之一
- GPU设备函数如何访问主机功能中定义的对象
- 如何将对象用作C 功能的参数
- 如何将指针分配给功能中的新对象,而不会使该对象在退出后消失
- 将对象传递到类,没有接收匹配功能错误
- 是否可以在辅助功能中概括对象类型
- 实现功能对象绑定而无需使用C 11
- 明智的选择是更喜欢lambdas功能对象
- 为什么不能将std :: stol转换为std ::功能对象
- 在不违反干prinicple的情况下,对传递功能对象的参数类型进行模板选择
- C 中的更大/较少功能对象
- 函子或功能对象的现实世界使用
- C++ 使用包含不同类型功能对象的基和派生类的 Reactor
- 如何在容器中存储具有不同签名的功能对象