Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : fonction apply / template [ Archives / Au secours ] (pointejb)

lundi 3 mai 2004 à 17:27:37 | fonction apply / template

pointejb


Bonjour à tous,


Je cherche un moyen d'implémenter une fonction de type 'apply' qui prendrait en parametres une fonction et ses arguments et qui aurait comme but d'appliquer cette fonction à ses arguments.

Exemple:

int specificFunctionToA(A* the_A)
{
//code spécifique à A
}

int specificFunctionToB(B* the_B)
{
//code spécifique à B
}

A* ptrA = new A();
B* ptrB = new B();

// Voici les appels possible à la fonction que je souhaite implémenter
int resultA = functionApply(specificFunctionToA,ptrA);
int resultB = functionApply(specificFunctionToB,ptrB);

Je cherche une fonction de type apply qui puisse prendre un type de fonction donné mais n'importe quel type d'arguments.

J'essai avec les templates et les pointeurs de membres de classe mais ça bloque à l'édition de liens et je pense que je fais fausse route dans mon implémentation.

Mon but est d'avoir une fonction de type apply pour gérer des exceptions et codes retours qui sont levés par les fonctions spécifiques:

template<typename T1, typenameT2> int functionApply(T1 specificFunctionToX,T2 X)
{
//Ici du code ....
try
{
int result = (specificFunctionToX)(X);
}
catch(e1& e)
{
cout<<"On a l'exception e1"<<endl;
//Ici du code propre à e1 ...
}
catch(e2& e)
{
cout<<"On a l'exception e2"<<endl;
//Ici du code propre à e2 ...
}
catch(e3& e)
{
cout<<"On a l'exception e3"<<endl;
//Ici du code propre à e3 ...
}

//Ici encore du code

}

Est-ce que je suis dans la bonne voie ?
Quelqu'un aurait-il une solution ?

Merci d'avance à ceux qui ont une idée.


"La vie, c'est comme une boite de chocolat..."









lundi 3 mai 2004 à 20:38:22 | Re : fonction apply / template

djl

tu ve faire un truc comme ca?

#include <iostream>


struct A
{
};


struct B
{
};

int specificFunctionToA(A* the_A)
{
//code spécifique à A
}

int specificFunctionToB(B* the_B)
{
//code spécifique à B
}

template <class T> int apply( int(*f)(T), T t)
{
return (*f)(t);
}

int main()
{
A a;
B b;
apply(specificFunctionToA,&a);
apply(specificFunctionToB,&b);
}


mardi 4 mai 2004 à 11:40:06 | Re : fonction apply / template

pointejb

C'est effectivement un truc comme ça.
En fait j'avais en plus un probleme de contravariance parce que je veux mettre cette fonction apply comme méthode d'une classe supérieure et la faire hériter dans les classe descendantes. J'ai trouvé une solution (similaire à la tienne) en contournant ce principe mais je crains que cela risque de core dumper un moment ou un autre.
La solution que j'ai trouvée est la suivante :


class SuperiorClass
{

public:

template<typename T1,typename T2, class T3>
int SuperiorClass::apply(T1 the_operation,
T2 the_para,
T3* the_class)
{

try
{
return (the_class->*Operation)(Para);
}
catch(CORBA::UserException& ex)
{
//....
}
}

//....

}


class InferiorClass : public SuperiorClass
{

public:

InferiorClass::InferiorClass(){a = new A();b = new B();}

int InferiorClass::specificFunctionToA(A* the_A)
{
//code spécifique à A
}

int InferiorClass::specificFunctionToB(B* the_B)
{
//code spécifique à B
}

private:

A* a;
B* b;

void InferiorClass::start()
{
int resultA = apply(specificFunctionToA,a,this);
int resultB = apply(specificFunctionToB,b,this);
}








mardi 4 mai 2004 à 20:56:44 | Re : fonction apply / template

djl


oui ca risque sans destructeur/operateur =/constructeur copie
...


pas la peine de specifier InferiorClass:: dans le corps de la classe et le this serait pas inutile quand tu appelle apply ?

pourquoi tu met pas tout simplement apply en virtuelle ? c'est pas ce que tu ve faire au finale?

mercredi 5 mai 2004 à 12:07:43 | Re : fonction apply / template

pointejb

Je ne l'ai pas spécifié mais j'ai bien un destructeur spécifique où je fais un delete des new que j'ai fait.
Je n'ai pas besoin d'opérateurs de classe comme = ni de constructeur par copie puique je ne m'en sers pas.
Le this est obligatoire car je ne peux pas déclarer une methode template en virtuelle (du moins d'après ce que j'ai lu et ce que g++ me dit).
Comme je veux que le template apply ait les mêmes propriétés qu'une methode virtuelle à savoir que dans apply si je veux utiliser une méthode de la classe InferiorClass qui est une redéfinition d'une méthode de la classe SuperiorClass, il faut soit que apply soit virtuelle (ce que je ne peux pas faire), soit que je spécifie explicitement la méthode que je désire utiliser (ce que je fais avec le pointeur this).


mercredi 5 mai 2004 à 12:08:04 | Re : fonction apply / template

pointejb

Je ne l'ai pas spécifié mais j'ai bien un destructeur spécifique où je fais un delete des new que j'ai fait.
Je n'ai pas besoin d'opérateurs de classe comme = ni de constructeur par copie puique je ne m'en sers pas.
Le this est obligatoire car je ne peux pas déclarer une methode template en virtuelle (du moins d'après ce que j'ai lu et ce que g++ me dit).
Comme je veux que le template apply ait les mêmes propriétés qu'une methode virtuelle à savoir que dans apply si je veux utiliser une méthode de la classe InferiorClass qui est une redéfinition d'une méthode de la classe SuperiorClass, il faut soit que apply soit virtuelle (ce que je ne peux pas faire), soit que je spécifie explicitement la méthode que je désire utiliser (ce que je fais avec le pointeur this).


mercredi 5 mai 2004 à 20:56:24 | Re : fonction apply / template

djl


a ba oui tien, je vien de voir pour le virtuelle, desole

sinon pour le this je pense à un truc, genre en utilisant le cast classe mere -> classe fille, enfin je vais voir

sinon quand tu a une classe ou par exemple tu a des membre qui sont des pointeures que tu alloue dans le constructeur, c'est une regle de securité que de redefinir l'operateur = et le constructeur par copie

parce que le jour ou tu fera

InferiorClass a;
InferiorClass b=a;

ou

InferiorClass c;
c=a;

ou n'importe quel passage/retour par copie, difficile de dir ce qui se passera mai gros plantage assuré

bref, on appel ca generalement la regle de 3 (constructeur par copie/operateur =/destructeur) et on dit alors que ta classe est canonique


jeudi 6 mai 2004 à 11:21:42 | Re : fonction apply / template

pointejb


Pour le this, j'ai pas réussi à trouver autre chose qui marche à cause du pointeur de membre que j'utilise dans la fonction appply.
En tous cas si tu as une idée je suis preneur.

C'est dommage qu'il n'y ait pas de notion de typage fort et dynamique en c++ (comme en Ocaml) parce que ca simplifirait les choses.

Sinon pour ce qui est de faire une classe canonique comme dans les règles de l'art, c'est clair que pour être propre et rigoureux dans mes dev il faudrait que je le fasse mais c'est pas faisable pour une raison de temps par rapport à ce que cela m'apporterait.
J'ai dans mes dev des arbres de classes contenant plusieurs dizaines de classes dont les membres sont des pointeurs, ce qui reviendrait à implémenter des constructeur par copie et opérateur = pour toutes.

A plus...



Cette discussion est classé dans : fonction, code, int, type, apply


Répondre à ce message

Sujets en rapport avec ce message

Une fonction multi-type ? [ par TeLeTUbIz ] Ouah !!!J'ai cherché, scruté dans tout les coins, soulevé les montagnes,... mais je ne trouve pas solution à mon problème.En fait, je voudrais faire u Variable de type char [ par wolfcyber ] bonjour, J'aimerais savoir l'equivalent en C++ de la fonction "Mid(int nStart,int nCount)" de la classe CString, pour une variable de type char. Cet Construire tableau code binaire des caractères avec l'arbre de Huffman [ par lordvan ] Bonjour à tous, voilà, je suis en train d'essayer de faire une fonction de parcours d'arbre de huffman. Cette fonction a pour rôle de construire le co Algo utile ou complètement "bidon"?? [ par ninjagtr ] Bonjour,Je suis tombé sur un bout de code et je ne sais pas s'il a une utilité (autre que de me faire chercher lol).Voici le code : int Devinez(int x) probleme structure et fonction [ par yanne1985 ] salutj'ai lcode suivanttypedef struct{    int n;   //......}essai;void miseZero(type **un_type){    (*un_type)->n=0;}int main(){    type *un_type;    Surdefinition de fonction [ par samaie ] float test(int i, int j) { return (float) i+j; } float test(float i, float j) <p align="le fonction recv [ par sy3ns ] bonjour, int recv(int s , void * buf , int len , unsigned int flags ); #define MAX  10int ta Créer une dll en C avec Code::Blocks [ par seb5 ] Salut à tous,Je souhaite placer certaines de mes fonctions dans une dll pour pouvoir les réutilisé dans plusieurs programmes. Je programme en C sous W MultiByteToWideChar et tous ce qui va avec [ par BEAUBRIUS ] BonjourJe suis sous windows et j'utilise VS2005Je voudrai lister les fichiers et sous repertoire d'un dossier.Apres quelque recherche a ce sujet , j'a Probleme Pointeur / Type [ par Math1004 ] Bonjour .J ai un probleme que je n arrive pas a resoudre meme si je pense avoir trouvé la cause .J'ai la fonction suivante :void SupprimerPart(int *nb


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.