C ++でネストされた関数をシミュレートします
-
27-10-2019 - |
質問
Cでは、次のコードがGCCで機能します。
int foo( int foo_var )
{
/*code*/
int bar( int bar_var )
{
/*code*/
return bar_var;
}
return bar(foo_var);
}
GCCコンパイラを使用して、C ++でネストされた機能の同じ機能を達成するにはどうすればよいですか?これが初心者の質問のように思えるかどうか気にしないでください。私はこのサイトに慣れていません。
解決
機能をファンチャーに変えます この記事では、ハーブサッターが提案しています
他のヒント
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);
}
ローカルファンクターを使用します
#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
...
}
ネストされた関数に最も近い構造は、C ++ 11ラムダです。
void SomeFunction(int x)
{
int var = 2;
auto lambda = [&] (int param) -> int { return var + param; };
printf("var + x = %d\n", lambda(x));
}
Lamdasでは、外側のスコープから変数を使用できます([&]は、参照により外部スコープからすべての変数を自動的にキャプチャするように指定します)。外側のスコープからの変数を使用しないラムダ(使用[])は、同じタイプの関数ポインターに変換でき、したがって関数ポインターを受け入れる関数に渡すことができます。
Boost :: Phoenixを使用してみることができます(V2はスピリットのサブパッケージで、V3は独自のパッケージであるため、SVN/トランクにあり、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);
}
C ++では、他の可能な手段によって同じ効果を達成することができます。直接ネストされた機能の実装はありません。 2つの役立つリンク:
AFAIK、ネストされた関数はC ++では許可されていません。
私はこのスレッドが古いことを知っています。しかし、C ++ 11の解決策は、Lambdasを書いて、いつでも電話をかけることです