349 votes

C ++ peut-on avoir des fonctions à l'intérieur des fonctions?

Je veux dire

 int main(){
  void a(){
  //code
  }
  a();
}
 

AFAIS: les classes et les structures imbriquées sont la solution la plus courante ...

451voto

sbi Points 100828

Non, C++ ne prend pas en charge.

Cela dit, vous pouvez avoir toutes les classes, et ils peuvent avoir des fonctions (non-static ou static), de sorte que vous pouvez obtenir ce à un certain degré, mais c'est un peu une bidouille:

int main() // it's int, dammit!
{
  struct X { // struct's as good as class
    static void a()
    {
    }
  };

  X::a();

  return 0;
}

Cependant, j'aurais de la question de la praxis. Tout le monde sait (bien, maintenant que vous faites, de toute façon, :)) C++ ne prend pas en charge les fonctions locales, de sorte qu'ils sont utilisés pour ne pas en avoir. Ils ne sont pas utilisés, cependant, pour que la bidouille. Je voudrais passer un bon moment sur ce code pour s'assurer qu'il est vraiment là que pour permettre à des fonctions locales. Pas bonne.

280voto

Konrad Rudolph Points 231505

C ++ 11 supporte cela en utilisant des lambdas / fermetures.

 int main() {
    auto f = []() { return 42; };
    std::cout << "f() = " << f() << std::endl;
}
 

Dans les versions récentes de GCC et de clang, vous pouvez le tester en transmettant l'indicateur -std=c++11 au compilateur.

54voto

phresnel Points 20082

Les classes locales ont déjà été mentionnées, mais voici un moyen de les laisser apparaître encore plus comme des fonctions locales, en utilisant une surcharge operator () et une classe anonyme:

 int main() {
    struct {
        unsigned int operator() (unsigned int val) const {
            return val<=1 ? 1 : val*(*this)(val-1);
        }
    } fac;

    std::cout << fac(5) << '\n';
}
 

Je ne conseille pas sur l'utilisation de ceci, c'est juste une astuce amusante (peut faire, mais à mon humble avis ne devrait pas).


Mise à jour 2014:

Avec la montée en puissance de C ++ 11 il y a quelque temps, vous pouvez maintenant avoir des fonctions locales dont la syntaxe rappelle un peu JavaScript:

 auto fac = [] (unsigned int val) {
    return val*42;
};
 

20voto

Nim Points 22570

Non.

Qu'essayez-vous de faire?

solution de contournement:

 int main(void)
{
  struct foo
  {
    void operator()() { int a = 1; }
  };

  foo b;
  b(); // call the operator()

}
 

17voto

Leo Davidson Points 3983

Vous pouvez, en quelque sorte, mais vous devez tricher et utiliser une classe factice:

 void moo()
{
    class dummy
    {
    public:
         static void a() { printf("I'm in a!\n"); }
    };

    dummy::a();
    dummy::a();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X