C语言胡成员函数指针模板不能够像函数指针模板一样发生简短的扬言方式也

http://topic.csdn.net/u/20101021/10/af09d7fb-5ab3-403d-a364-a6f06f472968.html

依照成员函数模板必须是:

template<typename T, typename RT, typename P1>
void test(T t1, RT (T::*mem_fun)(P1) , P1 p);

设若函数指针即能能是:
template<typename RT, typename P>
void test(RT (*func)(P) , P p);

又能是:
template<typename F, typename P>
void test (F fun, P p)

因使用状况,可以挑选简单的概念。


http://blog.sina.com.cn/s/blog\_4a50d85b0100umqe.html

C语言的指针相当之灵巧方便,但为相当容易出错。许多C语言初家,甚至C语言老鸟都死爱摔倒在C语言的指针下。但不可否认的凡,指针在C语言中之职极其重要,也许可以偏激一点底来说:没有指针的C程序不是真正的C程序。
  然而C++的指针也经常被自家同样种束手束脚的觉得。C++比C语言有双重严峻的静态类型,更加强调类型安全,强调编译时检查。因此,对于C语言中最容易错
用的指针,更是不可知放过:C++的指针被分为数据指针,数据成员指针,函数指针,成员函数指针,而且无能够不管相互转换。而且这些指针的声明格式都不雷同:

数据指针 T *
成员数据指针 T::*
函数指针 R (*)(…)
成员函数指针 R (T::*)(…)

再有一个再次着重的区分是,指针所占据的空中吗无均等了。即使以32位系统面临,所占据的长空为发出或是4字节、8字节、12字节甚至16字节,这个依据平台与编译器,有大可怜之浮动。
  尽管C++中还有万能指针void*,但她可属于被批斗的靶子,而且再也不能“万克”了。它不克换成成员指针。

  这样一来,C++的指针就易得挺为难:我们得平等栽指针能够针对同一类型的多少,不管是数据是平常数据,还是成员数;我们再亟待一致种指针能够对同一档次的函数,不管这函数是静态函数,还是成员函数。但是没有,至少从今天之C++标准被,还无看到。
 
沐枫网志 C++指针探讨(三)成员函数指针

  自从发生矣看似,我们初步按部就班 数据+操作 的方法来团数据结构;自从发生了模版,我们以起来把
数据 和 算法
分离,以便重用,实在够折腾人的。但不管怎么折腾,现在多数函数都不再独,都出嫁为了接近,进了包围。可是我们仍然需要能轻易调用这些分子函数。
  考虑一下windows下之定时调用。SetTimer函数的原型是这样的:

C语言 1UINT_PTR SetTimer(
C语言 2    HWND hWnd,
C语言 3    UINT_PTR nIDEvent,
C语言 4    UINT uElapse,
C语言 5    TIMERPROC lpTimerFunc
C语言 6);
C语言 7

里,参数就未讲了,这个函数估计大多数windows开发人员都理解。lpTimerFunc是独照面让定时调用的函数指针。假如我们不经过
WM_TIMER消息来点定时器,而是经过lpTimerFunc来自然时工作,那么我们就算只好利用普通函数或静态函数,而不顾都未能够利用成员函数,
哪怕通过静态函数转调也十分。

  再考虑一下线程的创建:

C语言 8uintptr_t _beginthread( 
C语言 9   void( *start_address )( void * ),
C语言 10   unsigned stack_size,
C语言 11   void *arglist 
C语言 12);C语言 13

start_address仍然单纯支持一般函数。不过当下反过来好了,它同意回调函数一个void*参数,它以会见arglist作为参数来调用
start_address。于是,聪明的C++程序员,就应用arglist传递this指针,从而采取静态函数成功之调用到了成员函数了:

C语言 14class mythread
C语言 15{
C语言 16  public:
C语言 17    static void doit(void* pThis)
C语言 18    {
C语言 19    ((mythread*)pThis)->doit();
C语言 20    }
C语言 21    void doit(){C语言 22}
C语言 23};
C语言 24
C语言 25main()
C语言 26{
C语言 27  C语言 28
C语言 29  mythread* pmt = new mythread;
C语言 30  _beginthread(&mythread::doit, 0, (void*)pmt);
C语言 31  C语言 32
C语言 33}

  但是明显,C++程序员肯定不见面为这个要满足。这里头起好多叫C++批判的无压因素。它用了C++中吃看无安全之类型转换,不安全的void*指
针,等等等等。但这是网啊C语言留下的调用接口,这为即认了。那么只要,我们就于C++程序中安来调用成员函数指针呢?
  如下例,我们打算对vector中之具有类调用该指定的成员函数:

C语言 34#include <vector>
C语言 35#include <algorithm>
C语言 36#include <functional>
C语言 37#include <iostream>
C语言 38using namespace std;
C语言 39
C语言 40class A
C语言 41{
C语言 42    int value;
C语言 43public:
C语言 44    A(int v){value = v;}
C语言 45    void doit(){ cout << value << endl;};
C语言 46    static void call_doit(A& rThis)
C语言 47    {
C语言 48        rThis.doit();
C语言 49    }
C语言 50};
C语言 51
C语言 52
C语言 53int main()
C语言 54{
C语言 55    vector<A> va;
C语言 56    va.push_back(A(1));
C语言 57    va.push_back(A(2));
C语言 58    va.push_back(A(3));
C语言 59    va.push_back(A(4));
C语言 60    //方法1:
C语言 61    //for_each(va.begin(), va.end(), &A::doit); //error
C语言 62    //方法2:
C语言 63    for_each(va.begin(), va.end(), &A::call_doit);
C语言 64    //方法3:
C语言 65    for_each(va.begin(), va.end(), mem_fun_ref<void, A>(&A::doit));
C语言 66
C语言 67    system(“Pause”);
C语言 68
C语言 69    return 0;
C语言 70}
C语言 71

  方法1,编译不可知经过。for_each只同意持有一个参数的函数指针或函数对象,哪怕A::doit默认有一个this指针参数为充分。不是for_each没考虑到当时或多或少,而是从做不交!
  方法2,显然是负了beginthread的迪,使用一个静态函数来转调用,哈哈不负众望了。但是不爽!这不是C++。
  方法3,呼,好不容易啊,终于用mem_fun_ref包装成功了成员函数指针。
  似乎方法3没错,又是项目安全的,又足以通用--慢着,首先,它不行可恶,哪起调用普通C函数指针那么漂亮啊(见智2),用了扳平死失误包装,又是尖括号又
是圆括号,还少不了&号!其次,它不得不包装无超过一个参数的函数!尽管她当for_each中足足用了,但是若而想就此当跳一个参数的场合,那无非
有相同句话:不可能的天职。

  是的,在正儿八经C++中,这是免可能的职责。但工作并无总是悲观的,至少发生好多叔方库提供了跨mem_fun的包。如
boost::function等等。但是其为产生限定:它所支撑之参数还是少的,只生十几近独,尽管够你用之了;同样,它也是丑陋之,永远不要想它会
简单的之所以&来搞定。

  也许,以去美丽的代价,来换取质量达标之保管,这为是C++对于函数指针的平等栽无奈吧……

  期待C++0x版本。它经过可转换模板参数,能够为mem_fun的参数达到至极个……

--------
   BTW: C++Builder扩展了一个最主要字 closure
,允许成员函数指针如同普通函数指针一样用。也许C++0x能考虑一下……


http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html

http://www.codeproject.com/KB/cpp/FastDelegate.aspx