2015-09-20 42 views
0

假設數我有一個方法:減少的參數

std::vector<double> minimize(double (*f)(const std::vector<double>& x)) 

,需要一個函數F(X)並發現X最小化它。假設我要最小化功能克(X,A)(相對於X),這也需要一個參數一個作爲參數:

double g(const std::vector<double>& x, const double a) 

我怎麼能做到這一點(在C++ 11)如果僅在運行時才知道a的值,則使用方法最小化

回答

4

您可以輕鬆使用拉姆達。

minimize([=](const std::vector<double>& x) { return g(x, a); }); 

這是假設您將函數更改爲使用std::function而不是函數指針。函數指針是非常有限的,不能做任何有趣的事情,就像這樣,所以最好忘記它們的存在。

+0

很好的答案,但它會更好,風格不使用默認的拍攝模式,也就是在這種情況下使用'[= A]'指示/確保只捕獲「a」。 – sgvd

+0

這是什麼意思?這只是手動執行編譯器可以爲你做的事情,即弄清楚lambda體使用的是什麼。關於這一點,沒有什麼「好風格」。通過引用默認捕獲有點更狡猾,但這是價值。 – Puppy

+0

通過值的默認捕獲可能*更多*狡猾,因爲你得到錯誤的安全性。 Meyers,有效的現代C++,第31項:'默認的按值捕獲誘使你認爲自己不受[懸空引用](你沒有)的影響,並且它讓你認爲你的封閉是自包含的(它們可能不是)「。最相關的是,如果'a'是一個成員變量:你*不*按值捕獲'a',而是'this'。如果你使用'[= a]',編譯器會給你一個錯誤,讓你想起它並希望它的危險('this'可能變成懸掛的,或者''a''可以在不同的線程中改變)。 – sgvd

1

按照Puppy的建議使用labda,但另外更新minimize作爲函數模板。使用模板參數,而不是的std ::功能將大大加快minimize

//somewhere in header file 
template<class Function> 
std::vector<double> minimize(const Function& f){ 
    ... 
} 
... 
//in any place where minimize is visible 
minimize([=](const std::vector<double>& x) { return g(x, a); }); 
+0

這是一個非常可怕的建議。速度並不是這裏真正重要的,這是靈活性。對於所有你知道的功能實際上是虛擬的,不能被模板化... – Puppy