类成员函数返回(成员)函数指针,包装类调用外部类的成员方法

#include<iostream>
using namespace std;
/*
template<typename T>
struct A{
	void Get(){
		cout << "A::Get" << endl;
	}
};
*/
//template<typename T>
struct A{
	void printf(){
		cout << "A::printf" << endl;
	}
	void (*Get())(){//返回函数指针
		return reinterpret_cast<void(*)()>(&printf); 
	}
};


int main(){

	A a;
	cout << "OK" << endl;
	auto f = a.Get();
	cout << "following is Get()" << endl;
	f();
	(*f)();
	void (*get)() = a.Get();
	get();
	(*get)();
	return 0;
}

OK
following is Get()
A::printf
A::printf
A::printf
A::printf


#include<iostream>
#include<type_traits>
using namespace std;

template<typename T>
using ObjectOf = typename remove_pointer<typename remove_reference<T>::type>::type;

template<typename T,T f>
struct CallbackWrapper{
	static void Get(){
	}
};
template<typename T,typename ...TArgs,void (T::*f) (TArgs...)>
struct CallbackWrapper<void (T::*) (TArgs...),f>
{
	static void Invoke(TArgs ...args,void *argument){
		(reinterpret_cast<T*>(argument)->*f)(args...);
	}	
	static void(*Get())(){//未知
		return reinterpret_cast<void(*)()>(&Invoke);
	}
};

/*
#define CALLBACK(OBJECT, NAME)\
	CallbackWrapper<\
		decltype(&ObjectOf<decltype(OBJECT)>::NAME),\
			 &ObjectOf<decltype(OBJECT)>::NAME\
		>::Get(),\
	static_cast<void*>(OBJECT)
*/

#define CALLBACK(OBJECT,NAME)\
	CallbackWrapper<\
	decltype(&ObjectOf<decltype(OBJECT)>::NAME),\
	ObjectOf<decltype(OBJECT)>::NAME>\
	::Get(),\
	static_cast<void*>(OBJECT)
	
//注:"\"后面不能有其他任意字符,包括空格
//以下纯属推测:
//CallbackWrapper<void (T::*) (TArgs...),f> 的 void (T::*) (TArgs...) 第一个参数类型 decltype(&Callback::Invoke./*成员函数指针*/) --> 成员函数指针
// 																	但是 这句仅仅是发挥指明成员函数类型的作用 与 void (T::*f) (TArgs...) 表明成员函数的身份类型
//					第二个参数类型 ObjectOf<decltype(OBJECT)>::NAME> 得到  Callback::Invoke 函数的指针 是 具体调用成员函数的主体
		
void Fuck(void(*shit)(),void *argument){
	auto bitch = reinterpret_cast<void(*)(int ,double,const char*,void *)>(shit);
	bitch(1,1.2,"Fuck GTK+ -- demo229.cpp",argument);
}
struct Callback{
	int context;
	void Invoke(int a,double b,const char* c){
		cout << context << "," << a << "," << b << "," << c << endl;
	}
};


int main(){
	Callback callback{200};
	Fuck(CALLBACK(&callback,Invoke));
	return 0;
}

200,1,1.2,Fuck GTK+ -- demo229.cpp


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值