• [^] # Re: simple ?

    Posté par (site web personnel) . En réponse au journal Rust en version 0.12. Évalué à 2.

    En fait si on veut avoir la même chose avec les std:function et que ça marche :

    #include <iostream>
    #include <functional>
    template <class T> std::function<T(T x)> square = [] (T x) {
     return x * x;
    };
    template <class T> std::function<T(T x, std::function<T(T x)> f)> twice = [] (T x, std::function<T(T x)> f) {
     return f(x) + f(x);
    };
    int main() {
     std::cout << twice<int>(5, square<int>) << std::endl;
     std::cout << twice<double>(5.1, square<double>) << std::endl;
     return 0;
    }

    Par contre il faut se méfier, il faut activer c++1y g++ -std=c++1y main.cpp pour avoir des variables paramétrables.

    En fait square et twice sont des variables de type std::function mais paramétrés (version template).

    Après si on veut simplifier un poil, on peut utiliser auto :

    #include <iostream>
    #include <functional>
    template <class T> std::function<T(T x)> square = [] (auto x) {
     return x * x;
    };
    template <class T> std::function<T(T x, std::function<T(T x)> f)> twice = [] (auto x, auto f) {
     return f(x) + f(x);
    };
    int main() {
     std::cout << twice<int>(5, square<int>) << std::endl;
     std::cout << twice<double>(5.1, square<double>) << std::endl;
     return 0;
    }