在C++中模拟嵌套函数

Pau*_*eon 27 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 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);
}
Run Code Online (Sandbox Code Playgroud)

在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);
}
Run Code Online (Sandbox Code Playgroud)

  • 在成员函数上缺少`static`? (2认同)

Pra*_*rav 12

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

  • 这是一个很好的链接,但你可以通过*展示它来改善这个答案*[正如Ben在答案中所做的那样.](http://stackoverflow.com/questions/5356050/simulating-nested-functions-in-c/ 5356065#5356065)仅限链接的答案......有点icky.无论链接有多好,如果它破裂,答案就变得毫无价值. (23认同)
  • @GMan:我说我投了票吗?@Prasoon:如果你对提高答案没兴趣,不要要求对选票进行解释.很久以前一直在投票的人 - 你得到的任何解释都来自像我这样的第三方.如果你只是为了寻求同情,那我就不应该打扰. (2认同)
  • @ Shog9:我说你做过吗?(不;事实上,我非常小心*不*暗示这是一种显然浪费的努力.) (2认同)
  • 我没有投票,但这个答案显然是错误的.(我的第一个代码片段是演示,它不是一个仿函数,它完全包含在外部函数中)/需要/ should /并且答案变为真,这就是为什么我既不向上也不向下 - 投票吧. (2认同)
  • @Prasoon:+1表示完全正确的答案.@GMan,@ Shog9:我不知道是谁贬低了这一点,但我怀疑其他两个答案的弃牌来自同一个沉默的<strike> killer </ strike> downvoter. (2认同)

Ale*_*hel 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
    ...
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*imo 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));
}
Run Code Online (Sandbox Code Playgroud)

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