在C ++中模拟嵌套函数

在C中,以下代码可以考虑我总是使用gcc。

int foo( int foo_var ) { /*code*/ int bar( int bar_var ) { /*code*/ return bar_var; } return bar(foo_var); } 

如何在gcc编译器上实现C ++中嵌套函数的相同function? 不介意这看起来像是一个初学者的问题。 我是这个网站的新手。

正如Herb Sutter在本文中所建议的那样,将您的function转变为仿函数

C ++中不允许使用本地函数,但本地类和本地类中允许使用函数。 所以:

 int foo( int foo_var ) { /*code*/ struct local { static int bar( int bar_var ) { /*code*/ return bar_var; } }; return local::bar(foo_var); } 

在C ++ 0x中,您还可以选择使用lambda语法创建仿函数。 这在C ++ 03中有点复杂,但如果你不需要捕获变量,那还是不错的:

 int foo( int foo_var ) { /*code*/ struct bar_functor { int operator()( int bar_var ) { /*code*/ return bar_var; } } bar; return bar(foo_var); } 

使用本地仿函数

 #define lambda(return_type, function_body) \ struct { return_type operator () function_body } int main () { lambda(int, (int x, int y) { return x > y ? x : y; } ) maxFunc; int m = maxFunc(1,2); //=> 2 ... } 

最接近嵌套函数的构造是C ++ 11 lambda。

 void SomeFunction(int x) { int var = 2; auto lambda = [&] (int param) -> int { return var + param; }; printf("var + x = %d\n", lambda(x)); } 

Lamdas允许使用外部作用域中的变量([&]指定通过引用自动捕获外部作用域中的所有变量)。 不使用外部作用域中的任何变量(使用[])的lambda可以转换为相同类型的函数指针,因此可以传递给接受函数指针的函数。

您可以尝试使用boost :: phoenix(v2是精灵的子包,v3在svn / trunk中,因为它是自己的包,应该在1.47中)

 #include  #include  using namespace boost::phoenix::arg_names; int foo( int foo_var ) { /*code*/ boost::function bar = _1 + 5; return bar(foo_var); } int main() { return foo(1); } 

在C ++中,您可以通过其他可能的方式实现相同的效果。 没有直接嵌套的函数实现。 两个有用的链接:

http://www.respower.com/~earlye/programming/19990916.001.htm

http://www.devx.com/tips/Tip/40841

AFAIK,C ++中不允许使用嵌套函数。