2013-05-30 94 views
0

爲了避免代碼重複,我打算將指針指向函數作爲靜態方法的參數。作爲參數的方法指針

我有一個只有靜態方法的類(地理)。其中一種方法(+++ Geo :: traceRay(+++))應該只顯示(Geo :: display(+++))幾件事情,然後返回一個int。另一個類(拉斯維加斯)需要使用Geo :: traceRay(+++)方法,但是應該顯示其他的(Las :: display(+++))。 所以我嘗試將函數參數的指針傳遞給Geo :: traceRay(+++,指向函數的指針)方法。指向的函數將會右鍵「顯示()」方法。

到目前爲止,將第一個指針傳遞給display()不是問題,但我找不到第二個指針。

class Geo 
{ 
public: 
    static bool display(int pix); 
    static int traceRay(int start, int end, bool (*func)(int) = &Geo::display); // no issue with this default parameter 
}; 


class Las 
{ 
public: 
    bool display(int pix); 
    void run(); 
}; 


int Geo::traceRay(int start, int end, bool (*func)(int)) 
{ 
    for (int i = start; i < end ; ++i) 
    { 
     if((*func)(i)) return i; 
    } 
    return end; 
} 

bool Geo::display(int pix) 
{ 
    cout << pix*100 << endl; 
    return false; 
} 


bool Las::display(int pix) 
{ 
    cout << pix << endl; 
    if (pix == 6) return true; 
    return false; 
} 

void Las::run() 
{ 
    bool (Las::*myPointerToFunc)(int) = &display;  // I can just use display as a non member class, but it should stay a member 
    Geo::traceRay(0,10, myPointerToFunc);    // issue here! 
} 


int main() 
{ 
    Geo::traceRay(0,10); // use the "normal display" = the default one// OK 

    Las myLas; 
    myLas.run(); 

    return 0; 
} 

回答

0

您不能將成員函數指針作爲函數指針傳遞。我認爲製作Las::display靜態不是一個選項。在這種情況下,我建議採取std::function並使用std::bind當前實例綁定:

static int traceRay(int start, int end, std::function<bool(int)> func = &Geo::display); 
... 
Geo::traceRay(0,10, std::bind(&Las::display, this, std::placeholders::_1)); 

此外,在這兩種情況下,你可以調用func

func(i); 

無需取消對它的引用第一。

+0

非常感謝這個答案。我不知道'std :: function'和'std :: bind'。我需要[鏈接](http://latedev.wordpress.com/2012/08/06/using-stdbind-for-fun-and-profit/)瞭解它是如何工作的,但現在我已經完全符合我的要求。另外,要從Las類調用Geo :: traceRay,必須使用Geo :: traceRay(0,10,std :: bind(&Las :: display,this,std :: placeholders :: _ 1));' – n3squik

+0

@ n3squik,哦,對不起。那麼我會更新我的答案。 – chris

0

克里斯建議如果這樣的話,那就太好了。

對此的另一種方法是,如果您有幾個共享函數,這將是有益的,將使用兩個實現的接口(使用虛擬方法Display(+++)),將實現的實例在Geo和Las的每一箇中都有問題(或Las可以直接實現這個接口)。然後traceRay引用接口基類並調用其上的顯示方法。