Bonjour,
j'ai une question au regard de l'utilisation de boost::bind et de la librairie de functor également présente i.e. boost::function. En gros j'utilise bind afin d'envoyer après création d'un objet une fonction libre de type double(double,double) a une grille de calcul génerique qui fonctionne uniquement avec des fonctions libres. Le soucis est que je désire écrire du code un peu générique et j'utilise le polymorphisme pour les objets créés. J'ai le code suivant:
Code :
- template<Rule1=default,Rule2=default>
- class A
- {
- public:
- A(){}
- A(double param1) : m_param1(param1){}
- virtual double evaluate(double x,double y){return x*m_param1+y;}
- virtual boost::function<double(double,double)> getFunctor()
- {return boost::function<double(double,double)>(boost::bind(evaluate,this,_1,_2));}
- virtual void(Grid* grid) sendfunction() {grid->sendFunction(getFunctor());}
- protected:
- double m_param1;
- }
- class B : virtual public A<default,default>
- {
- public:
- B():A<default,default>(){}
- B(double param1,double param2=0.) : A<default,default>(param1),m_param2(param2){}
- virtual double evaluate(double x, double y){return x*m_param1+y*m_param2;}
- private:
- double m_param2;
- }
- int main()
- {....}
|
Maintenant mon(mes) problème(s). Ce code compile sans soucis ni warning (VS 7.1 je crois). Toutefois l'éxecution au moment de l'appel du functor dans la grid de calcul, c'est n'importe quoi et dans la grande tradition de bind de boost, il est impossible de savoir ce qu'il se passe. Donc j'ai changer le code de getFunctor() pour:
Code :
- boost::bind(evaluate,(*this),_1,_2)
|
... et tout rentre dans l'ordre le binding est éxecuté sans problème et son éxécution sans soucis. Toutefois le polymorphisme est détruit dans la mesure où la fonction evaluate() bien que virtual est éxécuté à partir du this présent dans la classe A et donc va chercher la fonction evaluate de base.
Donc:
1- Pourquoi l'instanciation par pointer de boost::bind déconne (pour parler poliment) alors que la doc (par ex le livre de Karlsson) précise qu'il peut utiliser indiféremment objet, pointer, smart pointer etc...
2-Existe-t-il un moyen de garder le polymorphisme de evaluate tout en évitant de recopier la function getFunctor(). Est-ce que définir evaluate() en pure virtual (=0) fonctionnerait?
Merci d'avance.
Message édité par ElDesdichado le 27-09-2006 à 14:43:48