我想用一个函数指针分别指向多种类型的函数,例如:
声明一个指针 P 即可以指向
一个函数 int A(int a , int b) 也可以指向
另一个函数 char B(int a , int b , int c)
可以做到吗,该如何做呢?

解决方案 »

  1.   

    怎么可能呢
    最起码 函数int A(int a,intb) 定义函数指针后面的参数是两个
    而 char B(int a,int b,int c) 定义函数指针后面的参数是三个
    这一点就解决不了
    难道重载 。。
    所以这个是做不到的
      

  2.   

    可以的。 按照下面的方法宣告:typedef 返回类型  (*类型名)(参数类型1,参数类型2, ... )例如:
     
    typedef int (funcptr) (int x, int y, ... );这样是可以的。
      

  3.   

    #include <stdio.h>
    int fun1(int x)
    {
    return x+100;
    }int fun2(int x,int y)
    {
    return x+y;
    }main()
    {
    typedef int(*typefun1)(int);
    typedef int(*typefun2)(int,int);
    void *f; int x=100,y=200;
    int z,k;
    f=fun1;
    z=((typefun1)f)(x);
    f=fun2;
    k=((typefun2)f)(x,y);
    printf("z=%d,k=%d\n",z,k); return 0;
    }
    运行结果:
    z=200,k=300
      

  4.   

    sorry,掉了一个星号
    typedef int (*funcptr) (int x, int y, ... );
      

  5.   

    我做过你想做的那种程序
    在我的程序中可以随时添加新的win32动态库,然后执行它们中的函数Sikao(有点意思) 
    说的沾边,但还有一点关键问题没有解决
      

  6.   

    请问 super_xxx , 是什么问题没有解决? 能否把你的方法show出来?
      

  7.   

    本人的意思见是
    像SiKao说的那样,只不返回类型用 void,
    的引用的时候,用(数据类型 *) function();
    //强制把它转为想要的类型.!
    这样参数问题 能得到解决,返回类型也能得到解决~!
      

  8.   

    本人的意思见是
    像SiKao说的那样,只不返回类型用 void,
    的引用的时候,用(数据类型 *) function();
    //强制把它转为想要的类型.!
    这样参数问题 能得到解决,返回类型也能得到解决~!
      

  9.   

    blackmouse2002(binbin) 
    参数如何传递啊
     Sikao(有点意思) 
    你定义如下结构  typedef int (funcptr) (int x, int y, ... );
    但是dll函数 int fun(int ,int ,char) 或者包含其他类型参数如何处理呢
      

  10.   

    super_xxx() 
    我就是想达到你说的意思,可以说详细一些吗,或者贴点代码出来?多谢了!
    Sikao(有点意思)
    用你的方法,我必须要先定义出所有的类型,这样就毫无意义了!因为我无法预期所有函数的返回类型和参数数量!
      

  11.   

    super_xxx() 
    我就是想达到你说的意思,可以说详细一些吗,或者贴点代码出来?多谢了!
    Sikao(有点意思)
    用你的方法,我必须要先定义出所有的类型,这样就毫无意义了!因为我无法预期所有函数的返回类型和参数数量!
      

  12.   

    1、我的理解
    其实楼主的问题只是用一个指针去指向不同的函数,又何必在意这个指针是什么类型呢?只要调用的时候可以恢复就可以了亚。例如:
    void test()
    {
      return;
    }
    void SomeFunc()
    {
       void *pv;
       pv = (void*)test;  //这步就把函数指针转成void*了
       ((void (*)())pv)();//这步把pv打回原型了(调用的时候)
    }
    其余函数类型都可以此类推。
    2、我的问题
    其实我也有一个关于函数指针的问题,可是很少人回答,借着这里的人气,问一下,回答给分
    typedef void (ClassA::*FXN)(WPARAM wParam,LPARAM lParam);
    void ClassA::SomeFunc(FXN MyFunc,WPARAM wParam,LPARAM lParam)
    {
      MyFunc(wParam,lParam);
    }
    出现如下错误
    error C2064: term does not evaluate to a function
    为什么?
      

  13.   

    VincintCao(Vincint) 
    当不传递参数时你的方法是正确的,当传递参数时,你试过吗
      

  14.   

    1、
    QUOTE
    "Super_XXX():
    VincintCao(Vincint) 
    当不传递参数时你的方法是正确的,当传递参数时,你试过吗
    "
    void test(int a)
    {
      return;
    }
    void main()
    {
       void *pv;
       pv = (void*)test;  //这步就把函数指针转成void*了
       ((void (*)(int) )pv)(5);//这步把pv打回原型了(调用的时候)
    }
    2、我的第二个问题已经自己解决了,我已经将解决的方法贴到了自己提问的帖子上,有兴趣的可以去看看,因为全局函数的指针和成员函数的指针还是有一点区别的。
      

  15.   

    但是你要在程序中说明你的函数原型啊,和Sikao(有点意思) 的想法很类似现在是你的主程序不能动
    而你的dll中的函数可能改变,你只修改dll函数,不修改主程序
      

  16.   

    VincintCao(Vincint) 
    你的方法还是我得预先知道调用函数的原形,但关键是我无法预先知道super_xxx() 
    我加你qq了,等你在线时探讨一下,多谢了