Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1080452
  • 博文数量: 646
  • 博客积分: 288
  • 博客等级: 二等列兵
  • 技术积分: 5375
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-08 14:33
个人简介

为了技术,我不会停下学习的脚步,我相信我还能走二十年。

文章分类

全部博文(646)

文章存档

2014年(8)

2013年(134)

2012年(504)

分类:

2012-09-05 14:14:01

原文地址:union中存放函数地址 作者:wwm

最近项目中用到,union关联多个函数问题。感觉有些虚函数的妙处。

#include
#include


typedef void (*FUN)(); //空函数类型。用于指针转换。类似虚函数
typedef void (*FUN1)(int a);
typedef int (*FUN2)(int a,int b);
typedef char * (*FUN3)(char* a);

typedef struct {
    int a;
    union{    //在结构内只有一个函数地址
    FUN fun;
    FUN1 fun1;
    FUN2 fun2;
    FUN3 fun3;
    };
}ST_FUN;

void f() //空函数。用于指针转换
{
 
}

void f1(int f)
{
printf("size ==%d\n",f);
}

int f2(int a,int b)
{
    return (a+b);
}

char * f3(char *a)
{
return a;
}

ST_FUN funcs_list[]={  //定义时候要转换 为虚的
        {1,(FUN)f1},
        {2,(FUN)f2},
        {3,(FUN)f3},
    };
int main(int argc, char ** argv)
{

    funcs_list[0].fun1(345);   //直接使用了。这点不同于虚函数
    int f = funcs_list[1].fun2(1,2);
    printf("ok ---%d\n",f);
    char *p = funcs_list[2].fun3("wwm");
    printf("ok ---%s\n", p);
    printf("ok ---end\n");
    return 0;
}


//////////以下是类函数指针/////////////////////////////////////////////
#include
#include

class TEST;
typedef void (TEST::*FUN)(); //空函数类型。用于指针转换
//或者    typedef void (*FUN)();
typedef void (TEST::*FUN1)(int a);
typedef int (TEST::*FUN2)(int a,int b);
typedef char * (TEST::*FUN3)(char* a);
typedef struct {
    int a;
    union{  
    FUN fun;
    FUN1 fun1;
    FUN2 fun2;
    FUN3 fun3;
    };
}ST_FUN;

void f() //空函数。用于指针转换
{
 
}

class TEST
{
    public:
       
        void f1(int f)
        {
            printf("size ==%d\n",f);
        }
       
        int f2(int a,int b)
        {
            return (a+b);
        }
       
        char * f3(char *a)
        {
            return a;
        }
};
ST_FUN funcs_list[]={
        {1,(FUN)&TEST::f1},
        {2,(FUN)&TEST::f2},
        {3,(FUN)&TEST::f3},
    };
int main(int argc, char ** argv)
{
TEST test;
(test.*(funcs_list[0].fun1))(345);
    int f = (test.*(funcs_list[1].fun2))(1,2);
    printf("ok ---%d\n",f);
    char *p = (test.*(funcs_list[2].fun3))("wwm");
    printf("ok ---%s\n", p);
    printf("ok ---end\n");
    return 0;
}




阅读(665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~