web-dev-qa-db-fra.com

Comment définir des fonctions anonymes en C ++?

Puis-je définir des fonctions en ligne C++? Je ne parle pas des fonctions lambda, pas du mot-clé inline qui provoque une optimisation du compilateur.

42
danijar

C++ 11 ajouté fonctions lambda au langage. Les versions précédentes du langage (C++ 98 et C++ 03), ainsi que toutes les versions actuelles du langage C (C89, C99 et C11) ne prennent pas en charge cette fonctionnalité. La syntaxe ressemble à:

[capture](parameters)->return-type{body}

Par exemple, pour calculer la somme de tous les éléments d'un vecteur:

std::vector<int> some_list;
int total = 0;
for (int i=0;i<5;i++) some_list.Push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x) {
  total += x;
});
57
Adam Rosenfield

En C++ 11, vous pouvez utiliser des fermetures:

void foo()
{
   auto f = [](int a, int b) -> int { return a + b; };

   auto n = f(1, 2);
}

Avant cela, vous pouvez utiliser des classes locales:

void bar()
{
   struct LocalClass
   {
       int operator()(int a, int b) const { return a + b; }
   } f;

   int n = f(1, 2);
}

Les deux versions peuvent être faites pour faire référence aux variables ambiantes: Dans la classe locale, vous pouvez ajouter un membre de référence et le lier dans le constructeur; et pour la fermeture, vous pouvez ajouter un liste de capture à l'expression lambda.

24
Kerrek SB

je ne sais pas si je vous comprends bien, mais vous voulez une fonction lambda?

http://en.cppreference.com/w/cpp/language/lambda

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>


    int main()
    {
        std::vector<int> c { 1,2,3,4,5,6,7 };
        int x = 5;
        c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; } ), c.end());

        std::cout << "c: ";
        for (auto i: c) {
            std::cout << i << ' ';
        }
        std::cout << '\n';

        std::function<int (int)> func = [](int i) { return i+4; };
        std::cout << "func: " << func(6) << '\n'; 
    }

si vous n'avez pas c ++ 11x, essayez:

http://www.boost.org/doc/libs/1_51_0/doc/html/lambda.html

8
CyberGuy

Pré C++ 11, si vous voulez localiser une fonction à une fonction, cela peut être fait:

int foo () {
    struct Local {
        static int bar () {
            return 1;
        }
    };
    return Local::bar();
}

ou si vous voulez quelque chose de plus compliqué:

int foo (int x) {
    struct Local {
        int & x;
        Local (int & x) : x(x) {}
        int bar (int y) {
            return x * x + y;
        }
    };
    return Local(x).bar(44);
}

Mais si vous voulez un vrai littéral de fonction en pré C++ 11, ce n'est pas possible.

5
Thomas Eding