在C++里说到函数指针,有很多人都是避而远之,更别说什么“递归函数指针”了。但是实际上有的东西越是神秘,其原理反而越简单,所以我这里就先卖一个关子,假装介绍一个“高深的技巧”一样做这个开场白了。
什么是“函数指针”呢?(别砸我!我想从头开始讲)比如我们定义了一个函数:
int f(char);
我们先不管它的实现,我们只知道它的申明,那么我们就可以定义一个函数指针fp来指向它:
FuncPtr fp = f; //或:fp = &f;老实说,这2种写法有什么不同,我也不知道
fp(); //运行f函数
void g(char);
fp = g; //Error:type mismatch!
typedef int (* FuncPtr)(char);
fp的类型是FuncPtr。我这里只是简单的介绍,为后面的讨论做铺垫。如果你对这些代码有什么不懂的,我建议你还是看看专门的C++入门书籍。
现在我开始介绍“递归函数指针”。想象一下,如果一个函数能返回自己的指针,那么这个函数应该怎样定义呢?
FuncPtr fp = f(/*whatever*/); //运行f函数,得到函数指针
fp = fp(/*whatever*/); //运行f函数,得到函数指针
fp = fp(/*whatever*/); //运行f函数,得到函数指针
//...and so on
typedef FuncPtr (* FuncPtr)(/*whatever*/); //对应的函数指针的定义
FuncPtr f(/*whatever*/) //一个函数的定义
{
//do something...
return f; //返回函数的指针
}
TypeA function() //return type is TypeA
{
TypeA a;
return a; //value type is TypeA
}
void function(TypeA _tmp_)
{
TypeA a;
_tmp_ = a; //these are for "return a;"
return;
}
class TypeA{};
class TypeB
{
TypeB(){}
TypeB(const TypeA &){} //construct B from A
};
TypeB function()
{
TypeA a;
return a; //construct B-object from a
}
class _FuncPtrClass
{
//something magic here...
};
_FuncPtr f(/*whatever*/) //函数f定义
{
//do something...
return f;
}
typedef _FuncPtrClass (* FuncPtr)(/*whatever*/); //函数指针类型FuncPtr定义
class _FuncPtrClass
{
public:
typedef _FuncPtrClass (* FuncPtrInClass)(/*whatever*/); //重新定义FuncPtr为FuncPtrInClass
_FuncPtrClass(FuncPtrInClass f):f_(f){} //定制的构造函数
private:
FuncPtrInClass f_; //FuncPtrInClass类型的成员变量
};
class _FuncPtrClass
{
//...
public:
typedef _FuncPtrClass (* FuncPtrInClass)(/*whatever*/);
_FuncPtrClass(FuncPtrInClass f):f_(f){}
operator FuncPtrInClass(){return f_;} //从_FuncPtrClass到FuncPtrInClass转换的函数
private:
FuncPtrInClass f_;
};
_FuncPtr f(/*whatever*/)
{
//do something...
return f;
}
typedef _FuncPtrClass (* FuncPtr)(/*whatever*/);
FuncPtr fp = f(/*whatever*/); //运行f函数,得到函数指针
fp = fp(/*whatever*/); //运行f函数,得到函数指针
fp = fp(/*whatever*/); //运行f函数,得到函数指针
//...and so on
也许有人会认为我这里讲的例子一点实际用处也没有,的确,我也这样认为。不过我并不认为这个技巧是没用的。任何人说某个东西一点用处也没有,都有点武断的嫌疑。我所阐述的并不是这样的一个例子,而是这样的一种技巧,我也是从别的书上看过来的,但是我并不认为那位作者是在讲一个毫无用处的例子。