类成员函数返回(成员)函数指针,包装类调用外部类的成员方法
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
相关文章推荐
- python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法
- 【转】C++编程中用指针直接调用类成员函数问题及其解决方法
- 非static成员函数通过类名::来调用,空指针调用成员方法不出错!
- 在外部调用私有成员函数的方法
- MFC 外部普通函数获取类对象指针来调用类的成员函数
- 不知道子类成员函数的情况下,用父类方法调用子类的成员函数指针,需增加/vmg命令
- C++成员函数指针的另类调用方法
- VB动态调用外部函数的方法
- 空指针的成员函数调用
- 转: C++指针直接调用类成员函数探讨
- MFC界面包装类 ——多线程时成员函数调用
- 空指针为什么能调用成员函数?
- 空指针的成员函数调用
- 关于类成员函数指针的调用问题
- 获得全局函数和成员函数指针的部分traits的方法
- 私有成员函数一定不能被外部调用吗?
- C++中的成员函数调用原理及this指针的传递方式
- 创建线程调用类成员函数的方法。
- 关于VB调用Access的Rnd函数随机返回表中数据的解决方法
- MFC界面包装类-多线程时成员函数调用的断言失败