2017-03-17 5 views
0

J'essaie d'éviter ce code répétitif en écrivant une fonction de modèle.Fonction comme paramètres de modèle

#include <algorithm> 
class X { 

public: 
void get_amin(double *a){} 
void set_amin(double a){} 

void get_bmin(double *b){} 
void set_bmin(double b){} 

//...many pairs like above 

}; 
int main(){ 
     X *x1 = new X; 
     X *x2 = new X; 

     //code that will be repeated 
     { 
      double x1_amin; 
      x1->get_amin(&x1_amin); 
      double x2_amin; 
      x2->get_amin(&x2_amin);   
      x1->set_amin(std::min(x1_amin, x2_amin)); 
     } 
     //repeatation 
     {   
      double x1_bmin; 
      x1->get_bmin(&x1_bmin); 
      double x2_bmin; 
      x2->get_bmin(&x2_bmin);   
      x1->set_bmin(std::min(x1_bmin, x2_bmin)); 
     } 
     // 
     delete x1; 
     delete x2; 
} 

Maintenant, mes tentatives sont ci-dessous. Il semble que je suis capable d'écrire le modèle mais pas capable de l'utiliser. Les autres messages sur débordement de pile se concentrent principalement sur la façon d'écrire le modèle. Aussi je n'ai pas pu trouver un exemple où une fonction de membre de classe est utilisée.

#include <algorithm> 
#include <functional> 
class X { 

public: 
void get_amin(double *a){} 
void set_amin(double a){} 

void get_bmin(double *b){} 
void set_bmin(double b){} 

//...many pairs like above 

}; 

template <typename F11,typename F12, typename F2> 
void templatisedFunction(F12 f11,F12 f12,F2 f2) 
{ 
    double x1_amin; 
    f11(&x1_amin); 

    double x2_amin; 
    f12(&x2_amin);  

    f2(std::min(x1_amin, x2_amin)); 
} 

int main(){ 

    X *x1 = new X; 
    X *x2 = new X; 

    //templatisedFunction(x1->get_amin,x2->get_amin,x1->set_amin); 
    //templatisedFunction(x1->get_amin(double*),x2->get_amin(double*),x1->set_amin(double)); 


    //templatisedFunction<x1->get_amin(double*),x2->get_amin(double*),x1->set_amin(double)>(); 
    //templatisedFunction<x1->get_amin,x2->get_amin,x1->set_amin>(); 

    std::function<void(X*)> memfun(&X::get_amin);//not sure here 
    //templatisedFunction<x1->get_amin,x2->get_amin,x1->set_amin>(); 

    // 
    delete x1; 
    delete x2; 
} 
+0

Vous semblez avoir oublié de poser une question. – nwp

+0

Un pointeur vers la fonction membre peut être plus proche de ce que vous voulez que des modèles. – nwp

+0

@nwp Pourriez-vous donner un exemple de déclaration et d'affectation de pointeur de fonction dans ce cas? – qqqqq

Répondre

1

void (X::*getf)(double *) et void (X::*setf)(double) sont les signatures de fonction pour les deux pointeur vers une fonction membre que vous avez besoin.

en C++ 11:

int main() 
{ 
    X x1; 
    X x2; 

    auto lamb = [&](void (X::*getf)(double *), void (X::*setf)(double)) 
    { 
     double x1_amin; 
     (x1.*getf)(&x1_amin); 
     double x2_amin; 
     (x2.*getf)(&x2_amin);   
     (x1.*setf)(std::min(x1_amin, x2_amin)); 
    }; 

    lamb(&X::get_amin, &X::set_amin); 
    lamb(&X::get_bmin, &X::set_bmin); 
    return 0; 
} 
0

Vous pouvez utiliser des pointeurs vers les fonctions membres pour réduire la répétition:

void set_min(X &x1, X &x2, void (X::*get_min)(double *), void (X::*set_min)(double)) { 
    double x1_amin; 
    (x1.*get_min)(&x1_amin); 
    double x2_amin; 
    (x2.*get_min)(&x2_amin); 
    (x1.*set_min)(std::min(x1_amin, x2_amin)); 
} 

à utiliser comme ceci:

set_min(*x1, *x2, &X::get_amin, &X::set_amin); 
set_min(*x1, *x2, &X::get_bmin, &X::set_bmin); 

Si vous avoir plusieurs paires, vous pouvez aller encore plus loin et utiliser une boucle:

std::pair<void (X::*)(double *), void (X::*)(double)> get_set_pairs[] = { 
    {&X::get_amin, &X::set_amin}, 
    {&X::get_bmin, &X::set_bmin}, 
}; 
for (auto &get_set_pair : get_set_pairs){ 
    set_min(*x1, *x2, get_set_pair.first, get_set_pair.second); 
}