将成员函数转成全局函数

我们在开发中肯定遇到过将一个成员函数经过bind,变成一个std::function,可以用来做回调等等,std::function只能在C++中使用,假如我们想将成员函数绑定到一个全局函数的,暴露其函数指针,则C以及其他好多语言,也可以受惠了。

思路是使用模板,结合bind,为每一个绑定生成一个模板类,暴露类中的static函数。代码如下:

template<uint64_t id, class R, class C, class... Params, class Ptr, class Args>
mem_func_to_global(R(C::*mem_func)(Params...), Ptr pobj, Args... args) -> R(*)(Params...)
{
	class bind_delegate{
	public:
		using BindFunctorType = std::function<R(Params...)>;
		bind_delegate(BindFunctorType&& functor){
			assert(g_functor_ptr == nullptr);
			get_functor_ptr().reset(new BindFunctorType(functor));
		}
		static R call(Params... params){
			return (*get_functor_ptr())(params...);
		}
	private:
		static BindFunctorType& get_functor_ptr(){
			static std::unique_ptr<BindFunctorType> g_functor_ptr;
			return g_functor_ptr;
		}
	}
	auto temp_bind = std::bind(mem_func, pobj, args...);
	return bind_delegate(std::move(temp_bind)), &bind_delegate::call;
}

#define MEN_BIND(...) mem_func_to_global<__COUNTER__>(__VA_ARGS__);

1, 使用__COUNTER__宏,为每个调用生成一个id,也就会生成一个独一无二的模板函数

2,main函数结束时,会析构unique_ptr及其管理的functor

3,可使用原始指针绑定,也可使用智能指针,推荐智能指针。若绑定原始指针,调用者需要保证pobj析构后,不在调用call。

你可能感兴趣的:(C++,c++)