在C ++中模拟嵌套函数

时间:2011-03-18 18:04:45

标签: c++ c nested-function

在C中,以下代码适用于gcc。

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

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

8 个答案:

答案 0 :(得分:36)

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);
}

答案 1 :(得分:11)

将您的功能转换为Herb Sutter suggests in this article

的仿函数

答案 2 :(得分:10)

使用本地仿函数

#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
    ...
}

答案 3 :(得分:9)

最接近嵌套函数的构造是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不使用外部作用域中的任何变量(use []),可以转换为相同类型的函数指针,因此可以传递给接受函数指针的函数。

答案 4 :(得分:3)

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

#include <boost/spirit/include/phoenix.hpp>
#include <boost/function.hpp>

using namespace boost::phoenix::arg_names;

int foo( int foo_var )
{
 /*code*/
  boost::function<int(int)> bar = _1 + 5;
  return bar(foo_var);
}

int main() {
return foo(1);
}

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我知道这个线程很旧。但是C ++ 11解决方案是编写lambda,并在需要时调用它们