2014-05-05 83 views
2

我正在使用boost :: bind來即時創建組合函數,並希望將該對象存儲爲某些類成員變量以供以後使用。例如,我們有兩個函子:如何將boost :: bind對象存儲爲成員變量?

struct add{double operator()(double x, double y) const{return x+y;};}; 
struct multiply{double operator()(double x, double y) const{return x*y;};}; 

然後創建一個函數f(X,Y,Z)=(X + Y)* Z,我可以這樣做:

auto f = boost::bind<double>(multiply(), boost::bind<double>(add(), _1, _2), _3); 

,並呼籲f(x,y,z)完美地工作。現在我想把f保存爲類成員變量,如下所示:

struct F 
{ 
    auto func; 
    double operator(const std::vector<double>& args) const 
    { 
    return func(args[0],args[1],args[2]); //Skipping boundary check 
    } 
} 

F f_obj; 
f_obj.func = f; 
f_obj(args); 

但是我當然不能聲明一個自動變量。有什麼辦法可以解決這個問題嗎?

請注意,我沒有使用boost :: function,因爲它會顯着影響性能,這對我很重要。

感謝您的任何意見。

回答

5

兩種選擇:使用boost::function,並測量它是否實際影響性能。

或者,使F成爲以func的類型作爲參數的模板,並從bind表達式的類型推導出來。

編輯:與第二個選項的問題是它不擺脫尷尬的類型。您可以通過使用模板覆蓋的純虛函數定義一個基類來實現。但是,你有動態的內存管理和虛擬功能支付的成本 - 所以你不妨回到boost::function(或std::function),它爲你做了很多相同的事情。

+0

boost :: function正是我嘗試的第一件事,但編譯器不能內聯boost :: function包裝器。從我的測試中,使用boost :: function比本地代碼慢5倍,而直接使用boost :: bind沒有可觀察的開銷。 – matII

3

bind()返回的類型特定於函數對象和參數的每個組合。如果你想存儲結果,你需要以某種方式擦除類型。顯而易見的方法是使用function<..>

當頻繁調用結果函數對象時,由function<...>引入的有效執行虛擬調度的開銷可能太高。解決此問題的一種方法是將函數對象與適當的批量操作綁定,而不是存儲函數對象以存儲合適的應用程序。當需要單獨的呼叫時這並不會起作用,但是當需要大量呼叫時,虛擬調度只支付一次。

+0

非常有趣的想法。你能舉一個例子來說明它是如何實現的嗎? – matII

相關問題