28

在 C 中,以下代码在 gcc 中有效。

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

如何使用 gcc 编译器在 C++ 中实现与嵌套函数相同的功能?如果这似乎是一个初学者问题,请不要介意。我是这个网站的新手。

4

8 回答 8

37

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);
}
于 2011-03-18T18:06:14.993 回答
12

正如Herb Sutter 在本文中建议的那样,将您的函数变成函子

于 2011-03-18T18:07:15.773 回答
11

使用局部函子

#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
    ...
}
于 2013-07-05T08:26:09.317 回答
10

最接近嵌套函数的构造是 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 允许使用来自外部范围的变量([&] 指定通过引用自动捕获来自外部范围的所有变量)。不使用外部作用域(use [])的任何变量的 lambda 可以转换为相同类型的函数指针,因此可以传递给接受函数指针的函数。

于 2013-05-26T21:27:03.440 回答
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);
}
于 2011-03-18T18:19:38.543 回答
1

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

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

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

于 2011-03-18T18:08:58.467 回答
0

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

于 2011-03-18T18:06:30.793 回答
0

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

于 2019-03-23T05:11:59.010 回答