首先,来看下摘自网友的bind代码:
#include<iostream>
using namespace std;
namespace
{
class placeholder_ {};
placeholder_ __1;
}
template <typename R, typename T, typename Arg>
class simple_bind_t
{
private:
typedef R (T::*F)(Arg);
F f_;
T* t_;
Arg& a_;
public:
simple_bind_t(F f, T* t, Arg &a)
: f_(f), t_(t), a_(a)
{}
R operator()()
{
cout<<"operator 自动重载"<<endl;
return (t_->*f_)(a_);
}
};
template <typename R, typename T, typename Arg>
simple_bind_t<R, T, Arg> simple_bind(R (T::*f)(Arg), T* t, Arg& a)
{
return simple_bind_t<R, T, Arg>(f, t, a);
}
class bind_test
{
public:
void print_string(const std::string str)
{
printf("%s", str.c_str());
}
};
int main()
{
bind_test t;
std::string h = "hehe\n";
simple_bind(&bind_test::print_string, &t, h)();
}
以上实现的自定义的bind函数代码。
template <typename R, typename T, typename Arg>
class simple_bind_t
{
private:
typedef R (T::*F)(Arg);
F f_;
T* t_;
Arg& a_;
public:
simple_bind_t(F f, T* t, Arg &a)
: f_(f), t_(t), a_(a)
{}
R operator()()
{
cout<<"operator 自动重载"<<endl;
return (t_->*f_)(a_);
}
};
模板类simple_bind_t中,暂时三个模板参数不好说。
typedef R (T::*F)(Arg);
上式中用typedef给R起了一个别名,即两者等价,到这里喔们才明白R到底代表了什么,也就是用来bind的函数模板。此外,三个模板参数中T,Arg分别代表类,参数。
模板类simple_bind_t的三个成员变量:
F f_;
T* t_;
Arg& a_;
其中的F f_代表的是函数名称。
simple_bind_t(F f, T* t, Arg &a)
: f_(f), t_(t), a_(a)
{}
上面是模板类simple_bind_t的构造函数,目的是初始化私有成员变量。
R operator()()
{
cout<<"operator 自动重载"<<endl;
return (t_->*f_)(a_);
}
operator在这里实现的是重载,返回一个完整的函数调用:调用(*t_)对象中f_函数,并传入参数a_。
operator的两个作用:
- 重载
- 隐式转换
template <typename R, typename T, typename Arg>
simple_bind_t<R, T, Arg> simple_bind(R (T::*f)(Arg), T* t, Arg& a)
{
return simple_bind_t<R, T, Arg>(f, t, a);
}
上述代码在这里实现bind的实际模板:simple_bind,simple_bind_t<>指出返回类型,bind模板表面return一个simple_bind_t对象,实际会自动调用simple_bind_t中的operator重载运算符,最终返回一个调用函数体:return (t_->*f_)(a_)。
int main()
{
bind_test t;
std::string h = "hehe\n";
simple_bind(&bind_test::print_string, &t, h)();
}
在main函数中,展示了bind模板的使用:simple_bind(传入被调用函数地址,传入对象,传入参数)。
最终输出结果为:
$g++ -std=c++11 -o main *.cpp
$main
operator 自动重载
hehe
289



被折叠的 条评论
为什么被折叠?



