WEB开发网
开发学院软件开发C++ c++的bind简单实现 阅读

c++的bind简单实现

 2012-05-23 16:11:29 来源:WEB开发网   
核心提示: 本人以前在读<< Beyond the C++ Standard Library>> 书的时, 然后自己测试的的示例代码. 今天又看到了, 感觉可以分享出来, 帮助一些人理解bind的实现, 理解占位符.bindnamespace{class placeholder_ {};placehold

 本人以前在读<< Beyond the C++ Standard Library>> 书的时, 然后自己测试的的示例代码. 今天又看到了, 感觉可以分享出来, 帮助一些人理解bind的实现, 理解占位符.

bind

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()()
	{
		return (t_->*f_)(a_);
	}
};

template <typename R, typename T, typename Arg>
class simple_bind_t2
{
private:
	typedef R (T::*F)(Arg);
	F f_;
	T* t_;

public:
	simple_bind_t2(F f, T* t)
		: f_(f), t_(t)
	{}

	R operator()(Arg& a)
	{
		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);
}

template <typename R, typename T, typename Arg>
simple_bind_t2<R, T, Arg> simple_bind(R (T::*f)(Arg), T* t, placeholder_& a)
{
	return simple_bind_t2<R, T, Arg>(f, t);
}

class bind_test
{
public:
	void print_string(const std::string str)
	{
		printf("%s", str.c_str());
	}
};

void test()
{
	bind_test t;
	std::string h = "hehe\n";
	simple_bind(&bind_test::print_string, &t, h)();
	simple_bind(&bind_test::print_string, &t, __1)(h);
	boost::function<void (const std::string)> f;
	f = simple_bind(&bind_test::print_string, &t, __1);
	f(h);
}

C/C++代码

test函数返回结果应该是:
hehe
hehe
hehe

Tags:bind 简单 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接