2010-11-16 66 views
2

我有很多使用函數指針作爲double (*f)(double)形式的參數的遺留代碼。現在我有一個需求,我需要從類中調用此函數,但函數定義使用成員變量。我該如何解決這個問題?例如,已知參數的函數指針

void legacy_function(double (*f)(double)) { .... } 

class myclass { 
    double a; 
    double b; 
    double c; 

    void mymethod(...) { 
     // need to call legacy_function() such that it uses a and b with one unknown 
     // a+b*x 

    }  

請注意,我無法更改舊代碼中的定義或聲明。

我希望這是有道理的。感謝您的建議..

+0

如果你可以改變遺留代碼,boost :: function會適合。見 http://www.boost.org/doc/libs/1_44_0/doc/html/function/tutorial.html#id1264562 – 2010-11-16 07:22:28

回答

3

有沒有乾淨的方式來解決這個問題。它在標準語言的範圍內沒有優雅的解決方案。

你可以做的一件事是提供一個全局或靜態變量,作爲this指針用於中間回調包裝函數(請參見下文),並編寫一個靜態中間回調包裝器函數,該函數將取消對非-static類方法

class myclass { 
    ... 
    static myclass *myclass_this; 

    double callback_wrapper(double d) { 
    assert(myclass_this != NULL); 
    return myclass_this->callback(d); // calls the actual implementation 
    } 
}; 

而且寫myclass

class myclass { 
    ... 
    double callback(double d) { 
    // do whatever you want with `a`, `b` etc. 
    return /* whatever */; 
    } 
    ... 
}; 

實際的回調實現現在可以初始化myclass_this並使用間從所有這裏面mymethod

... 
void mymethod(...) { 
    myclass_this = this; // initilize the context 
    legacy_function(&callback_wrapper); 
} 
... 

調解回調的包裝,當然,是非常不雅,因爲它依賴於全局或靜態變量,因此是不可重入。

還有其他的方法,這些方法都是不可移植和非標準的。 (閱讀約關閉delegates)。

+0

+1我想不出另一種解決方案 – icecrime 2010-11-16 07:33:07