[C++] template de fonction

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 17 déc. 2007 à 17:04
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 - 18 déc. 2007 à 09:29
Bonjour,
je me posait une question : serait il possible de faire des template de fonction ? (je pense que la réponse est non, mais si vous pouviez confirmer)
Je m'explique. J'ai une class Matrice, et je redefini pas mal de fonction (cosinus, log etc.) de façon à faire cos(matrice) directement.
Je me suis dit, il serait intéressant de faire ça en template, dans le genre :
template<function f> matrice f(matrice M)
{
matrice A=M;
for(tout les membres de la matrice)
A[i][j]=f(M[i][j]);
return A;
}

Merci de vos réponses
A voir également:

3 réponses

mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
17 déc. 2007 à 21:38
En fait tu peux passer en paramètres template un foncteur.
#include <iostream>

template <typename T>
struct add_f{
    inline T operator()(const T & x,const T & y) const{
        return x + y;
    }
};

template <typename T>
struct mult_f{
    inline T operator()(const T & x,const T & y) const{
        return x * y;
    }
};

template <typename T,typename F>
T appliquer_foncteur(const T & x,const T & y){
    return F()(x,y);
}

int main(){
    {
        typedef add_f<int> add_int;
        int x = 5, y = 6;
        std::cout << appliquer_foncteur<int,add_int>(x,y) << std::endl;
    }

    {
        typedef mult_f<float> mult_float;
        float x = 6.9, y = 2.8;
        std::cout << appliquer_foncteur<float,mult_float>(x,y) << std::endl;
    }
    return 0;
}

Ce qui donne :
11
19.32

Je rappelle au passage que toute structure template doit être intégralement dans un .hpp, sinon elle n'est utilisable que dans le fichier source dans lequel elle est implémentée. Bien entendu tu n'es sensé qu'inclure des headers, donc les structures, classes et fonctions templates sont en général implémentées dans un header.

Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 déc. 2007 à 23:08
Ok, merci de la réponse.
C'est pas évidant, je vais regarder ça de plus près.
La solution que j'applique est un peut différente, mais fonctionne.
class matrice{
//divers memebre de la classe
matrice fct(double f(double));
}
ce qui permet de faire une fonction non défini de la façon suivante :
matrice A;
A.fct(fonction_a_appliquer_a_la_matrice).
0
mamiemando Messages postés 33081 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 avril 2024 7 749
18 déc. 2007 à 09:29
Ben en C il était déjà possible de passer un pointeur de fonction si tu vas dans ce sens. Cf la fonction qsort par exemple.

Bonne chance
0