您的位置:首页 > 其它

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

2016-12-05 10:30 417 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: