Fonctions imbriquées en simulant C ++
-
27-10-2019 - |
Question
En C le code suivant fonctionne dans gcc.
int foo( int foo_var )
{
/*code*/
int bar( int bar_var )
{
/*code*/
return bar_var;
}
return bar(foo_var);
}
Comment puis-je obtenir les mêmes fonctionnalités de fonctions imbriquées en C ++ avec le compilateur gcc? Ca ne me dérange pas si cela semble être une question de débutant. Je suis nouveau sur ce site.
La solution
Transformez votre fonction en tant que foncteur Herb Sutter suggère dans cet article
Autres conseils
Fonctions locales ne sont pas autorisés en C ++, mais les classes locales sont et la fonction sont autorisés dans les classes locales. Donc:
int foo( int foo_var )
{
/*code*/
struct local
{
static int bar( int bar_var )
{
/*code*/
return bar_var;
}
};
return local::bar(foo_var);
}
En C ++ 0x, vous aussi, vous avez la possibilité de créer un foncteur en utilisant la syntaxe lambda. C'est un peu plus compliqué en C ++ 03, mais quand même pas mal si vous ne avez pas besoin de variables de capture:
int foo( int foo_var )
{
/*code*/
struct bar_functor
{
int operator()( int bar_var )
{
/*code*/
return bar_var;
}
} bar;
return bar(foo_var);
}
utiliser foncteur locale
#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
...
}
Le produit de construction qui se rapproche le plus de fonctions imbriquées est le 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 permettent d'utiliser des variables du champ extérieur (les [&] Précise pour capturer automatiquement toutes les variables du champ d'application externe par référence). A lambda, qui n'utilise les variables de la portée extérieure (utilisation []) peut être converti en un pointeur de fonction de même type et peut donc être transmis à des fonctions d'acceptation d'un pointeur de fonction.
Vous pouvez essayer d'utiliser boost :: Phoenix (v2 est un sous-paquet d'esprit, v3 est dans svn / trunk comme son propre paquet et devrait être en 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);
}
En C ++ vous pouvez obtenir le même effet par d'autres moyens. Il n'y a pas de mise en oeuvre de fonction directe imbriquées. Deux liens utiles:
http://www.respower.com/~earlye/programming/19990916.001. htm
AFAIK, les fonctions imbriquées ne sont pas autorisés en C ++.
Je sais que ce fil est vieux. Mais un C ++ 11 solution serait de lambdas d'écriture et de les appeler à chaque fois voulu