有一个函数,他的功能是把另外一个函数指针放入数组中 
int ADD(void(*p)(int,int) proc)
{
 return p(1,2);
}
其中需要放入的函数为
int max(int a, int b)
{
 return a+b;
}这个函数可能是在类中间 可能是不在类中
比如
int CLASS::max(int a, int b)

 return a+b;
}
//主函数
int main()
{
 ADD(&max);
 CLASS *a =new CLASS;
 ADD(&a->max);
}
这样的有办法么? 我写出来报错。。

解决方案 »

  1.   


    typedef int(* ADDPROC)(int, int);template <class ToType, class FromType>
    ToType union_cast (FromType f)

      union { FromType _f; ToType _t; } ut; 
      ut._f = f;
      return ut._t; 
    }int ADD(ADDPROC p)
    {
      return p(1,2);
    }int Max(int a, int b)
    {
      return a+b;
    }class CLASS
    {
    public:
      int Max(int a, int b);
    };int CLASS::Max(int a, int b)

      return a+b;
    }//主函数
    int main()
    {
      ADD(&Max);
      ADD(union_cast<ADDPROC>(&CLASS::Max));
      return 0;
    }
      

  2.   


    几个重点:
    1.函数指针类型声明:typedef int(* XXX)(int, int);
    2.如果使用这种ADD(&max)函数指针写法,max必须是静态和事先声明,不支持动态创建。  
      

  3.   


    2#楼的方法确实可以加入了.. 只是调用就会出现
    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.只是一加入就会出现这样的情况.申明 
    typedef void(* ADDPROC)(HWND, UINT,WPARAM,LPARAM);
    template <class ToType, class FromType>
    ToType union_cast (FromType f)

      union { FromType _f; ToType _t; } ut; 
      ut._f = f;
      return ut._t; 
    }
    调用时
    bool ModuleAddWin(YWin * rwin)
    {
    ADDPROC t  =union_cast <ADDPROC>(&YWin::WinProc );
    t(NULL,NULL,NULL,NULL);
    }
    调用时
    YWin  * win =new YWin ();
    ModuleAddWin (win);
    然后就报错了
      

  4.   

    类的成员函数是有this的  也就是说CLASS::max的并不是void(*p)(int,int)这个类型
      

  5.   

    只能用静态成员函数了,除非你会用Thunk插入this指针typedef int(* ADDPROC)(int, int);
     
    int ADD(ADDPROC p)
    {
      return p(1,2);
    }
     
    int Max(int a, int b)
    {
      return a+b;
    }
     
    class CLASS
    {
    public:
      static int Max(int a, int b)
      { 
        return a+b;
      }
    };
     
    //主函数
    int main()
    {
      ADD(&Max);
      ADD((ADDPROC)&CLASS::Max);
      return 0;
    }
      

  6.   

    楼主是要把void WinProc(HWND, UINT, WPARAM, LPARAM)这样一个函数指针传递给ModuleAddWin,由ModuleAddWin来调用WinProc吗?
    如果是这样,你的代码中的YWin::WinProc应该可以声明为静态成员函数。
    修改ModuleAddWin函数:
    bool ModuleAddWin(YWin * rwin)
    {
       HWND hwnd = YWin->m_hWnd; //不知道你的YWin是一个窗口,还是一个别的什么类。但总是可以得到HWND句柄吧。   
       ADDPROC t  = (&YWin::WinProc);
       t(NULL,NULL,NULL,NULL);
     }