void*和类成员函数指针的相互转换
2014-11-11 13:15
323 查看
linux环境下,强地址转换会在O3的时候出问题
正确的代码如下,
#include <stdio.h>
#include <stdlib.h>
#include <new>
#include <string.h>
class class1
{
public:
class1()
{
b = 10;
}
int memfunc1(int a)
{
printf("memfunc1 this %p\n", this);
return a - b;
}
private:
int b;
};
template <typename F>
F fkvoidcastmemfunc(void * p)
{
return *(F*)p;
}
void* mymalloc(size_t size)
{
printf("mymalloc %d\n", size);
return malloc(size);
}
template <typename F>
void * fkmemfunccastvoid(F f)
{
void * p = mymalloc(sizeof(F));
new(p) F(f);
return p;
}
typedef int (class1::*func1)(int);
int main(int argc, const char *argv[])
{
class1 * p = new class1;
func1 f = &class1::memfunc1;
(p->*(f))(2);
printf("f %p %d\n", f, sizeof(func1));
void * pp = fkmemfunccastvoid(f);
printf("pp %p\n", pp);
func1 fff = fkvoidcastmemfunc<func1>(pp);
printf("fff %p\n", fff);
if (f == fff)
{
printf("f == fff\n");
}
else
{
printf("f %p != fff %p\n", f, fff);
}
(p->*(fff))(2);
return 0;
}
正确的代码如下,
#include <stdio.h>
#include <stdlib.h>
#include <new>
#include <string.h>
class class1
{
public:
class1()
{
b = 10;
}
int memfunc1(int a)
{
printf("memfunc1 this %p\n", this);
return a - b;
}
private:
int b;
};
template <typename F>
F fkvoidcastmemfunc(void * p)
{
return *(F*)p;
}
void* mymalloc(size_t size)
{
printf("mymalloc %d\n", size);
return malloc(size);
}
template <typename F>
void * fkmemfunccastvoid(F f)
{
void * p = mymalloc(sizeof(F));
new(p) F(f);
return p;
}
typedef int (class1::*func1)(int);
int main(int argc, const char *argv[])
{
class1 * p = new class1;
func1 f = &class1::memfunc1;
(p->*(f))(2);
printf("f %p %d\n", f, sizeof(func1));
void * pp = fkmemfunccastvoid(f);
printf("pp %p\n", pp);
func1 fff = fkvoidcastmemfunc<func1>(pp);
printf("fff %p\n", fff);
if (f == fff)
{
printf("f == fff\n");
}
else
{
printf("f %p != fff %p\n", f, fff);
}
(p->*(fff))(2);
return 0;
}
相关文章推荐
- void*和类成员函数指针的相互转换
- 怎样将成员函数指针强制转换成void*指针?
- 怎样将成员函数指针强制转换成void*指针?
- 怎样将成员函数指针强制转换成void*指针?
- 怎样将成员函数指针强制转换成void*指针?
- 怎样将成员函数指针强制转换成void*指针?
- 怎样将 类成员函数指针 强制 转换成 void*指针
- 使用std::function 把类成员函数指针转换为普通函数指针
- c++ 成员函数 普通函数指针转换
- 使用std::function 把类成员函数指针转换为普通函数指针
- 成员函数指针:(结构+与普通函数指针之间的转换)
- c++ 父类指针转换为子类指针后调用子类的成员函数问题
- 成员函数指针与高性能的C++委托(中篇)
- 成员函数指针与高性能的C++委托(上中下篇)
- 获得全局函数和成员函数指针的部分traits的方法
- ads中关于函数指针转换的很奇怪的问题
- C++的类成员函数指针
- C++指针直接调用类成员函数探讨
- 成员函数指针【转贴】
- 指向成员函数的指针类型成员变量