模拟 C++ 中的嵌套函数

发布于 2024-10-24 03:24:15 字数 253 浏览 7 评论 0原文

在 C 中,以下代码可在 gcc 中运行。

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

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

In C the following code works in gcc.

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

How can I achieve the same functionality of nested functions in C++ with the gcc compiler? Don't mind if this seems like a beginner question. I am new to this site.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

黯淡〆 2024-10-31 03:24:15

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

Local functions are not allowed in C++, but local classes are and function are allowed in local classes. So:

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

In C++0x, you would also have the option of creating a functor using lambda syntax. That's a little more complicated in C++03, but still not bad if you don't need to capture variables:

int foo( int foo_var )
{
 /*code*/
  struct bar_functor
  {
    int operator()( int bar_var )  
    {
      /*code*/
      return bar_var;
    }
  } bar;
  return bar(foo_var);
}
有深☉意 2024-10-31 03:24:15

按照Herb Sutter 在本文中建议的 将您的函数转换为函子

Turn your function into a functor as Herb Sutter suggests in this article

妳是的陽光 2024-10-31 03:24:15

最接近嵌套函数的构造是 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));
}

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

The construct that comes closest to nested functions is the 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 allow to use variables from the outer scope (the [&] specifies to automatically capture all variables from the outer scope by reference). A lambda, that does not use any variables from the outer scope (use []) can be converted to a function pointer of the same type and can thus be passed to functions accepting a function pointer.

行雁书 2024-10-31 03:24:15

使用局部函子

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

use local functor

#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
    ...
}
萝莉病 2024-10-31 03:24:15

你可以尝试使用 boost::phoenix (v2 是spirit 的一个子包,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);
}

You could try using boost::phoenix (v2 is a subpackage of spirit, v3 is in svn/trunk as it's own package and should be in 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);
}
别理我 2024-10-31 03:24:15

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

AFAIK, nested functions are not allowed in C++.

孤檠 2024-10-31 03:24:15

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

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

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

In C++ you may achieve the same effect by other possible means. There are no direct nested function implementations. Two helpful links:

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

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

安静 2024-10-31 03:24:15

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

I know this thread is old. But a C++11 solution would be to write lambdas and call them whenever wanted

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文