深度剖析C++模板编程之bind实现
#include <iostream>
struct Test
{
void fun_1(int x)
{
std::cout << "fun_1(int x) : x = " << x << std::endl;
}
};
namespace mystl
{
template <typename MemberFunc, typename ObjAddr>
class function
{
MemberFunc _func;
ObjAddr _objAddr;
public:
function(MemberFunc func, ObjAddr objAddr) :_func(func), _objAddr(objAddr){}
template <typename Arg>
void operator()(Arg arg)
{
(_objAddr->*_func)(arg);
}
};
template <typename MemberFunc, typename ObjAddr>
function<MemberFunc, ObjAddr> bind(MemberFunc func, ObjAddr objAddr)
{
function<MemberFunc, ObjAddr> res(func, objAddr);
return res;
}
}
int main(void)
{
Test test;
mystl::function<void(Test::*)(int), Test*> func = mystl::bind(&Test::fun_1, &test);
func(12345);
std::cout << "main end" << std::endl;
return 0;
}
这个demo实现存在一些问题:
(1)只能调用成员函数且形参的个数只有一个
(2)调用后的函数返回值获取不到,因为重载括号的时候只返回了void
(3)在写mystl::bind类型的时候比较麻烦,原来的本意是尽可能让编译器自动推导
所以需要进行下面的改进:
1.