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では、ラムダ構文を使用してファンクターを作成するオプションもあります。これは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

ハーブサッターがこの記事で示唆しているように、関数をファンクターに変えましょう

于 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 ラムダです。

void SomeFunction(int x)
{
    int var = 2;
    auto lambda = [&] (int param) -> int { return var + param; };

    printf("var + x = %d\n", lambda(x));
}

ラムダでは、外側のスコープから変数を使用できます ([&] は、参照によって外側のスコープからすべての変数を自動的にキャプチャすることを指定します)。外部スコープの変数を使用しないラムダ ([] を使用) は、同じ型の関数ポインターに変換できるため、関数ポインターを受け入れる関数に渡すことができます。

于 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 ++では、他の可能な方法で同じ効果を達成できます。直接ネストされた関数の実装はありません。2つの役立つリンク:

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 に答える