2017-03-17 112 views
0

我想通過編寫一個模板函數來避免這個重複的代碼。作爲模板參數

#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; 
} 

現在我的嘗試如下。看來我能夠編寫模板但無法使用它。堆棧溢出的其他帖子主要集中在如何編寫模板。另外我找不到一個使用類成員函數的例子。

#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

您似乎忘記提問了。 – nwp

+0

成員函數指針可能比模板更接近你想要的。 – nwp

+0

@nwp在這種情況下,你能否提供一個函數指針聲明和賦值的例子? – qqqqq

回答

1

void (X::*getf)(double *)void (X::*setf)(double)是兩個成員函數指針,你需要的函數簽名。

使用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

您可以使用指針成員函數,以減少重複:

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)); 
} 

使用這樣的:

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

如果您有很多對你可以走得更遠,並使用一個循環:

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); 
}