2014-02-11 83 views
1

我有一個bisectionMethod函數,它接受一個函數作爲其參數之一。對於方法的意圖和目的,它接受的函數參數只有一個正在優化的參數。但是,我想將任何類型的函數(包含任意數量的參數)傳遞給bisectionMethod函數。我在bisectionMethod函數中使用了一個指針函數作爲參數,但它要求我精確指定有多少個參數進入該指針函數。什麼是最好的解決方法?將一個函數(可變參數數量!)作爲參數傳遞

例如,我試圖做這樣的事情:

double bisectionMethod(double xMinimum, double xMaximum, double maxError, double (*rootFunc)(double)) 
{ 
    ... 
    return ret; 
} 

double foo1(double x1, double y1){return x1 * y1;} 
double foo2(double x2, double y2, double z2){return x2 * y2 * z2;} 

int main(){ 

// I want to first be able to set y1 in foo1. 
// Then I want to solve for x1 
bisectionMethod(5, 250, 0.1, foo1(x1)); 

// I want to also be able to use bisectionMethod with foo2 
// I want to first be able to set x1, and y1 in foo2. 
// Then I want to solve for z1 
bisectionMethod(5, 250, 0.1, foo1(z1)); 

return 0; 

} 

希望的例子是有道理的。我知道這有點奇怪。任何幫助,將不勝感激。謝謝!

+0

只需使用一個推導類型參數和'的std :: bind'。 – chris

+0

C++ 11 lambda如何? –

+0

或'boost:bind' – Mine

回答

0
#include <functional> 
using namespace std; 
using namespace std::placeholders; 

double bisectionMethod(double xMinimum, double xMaximum, double maxError, function<double (double)>) 
{ 
    ... 
    return ret; 
} 

double foo1(double x1, double y1){return x1 * y1;} 
double foo2(double x2, double y2, double z2){return x2 * y2 * z2;} 

int main(){ 

// I want to first be able to set y1 in foo1. 
// Then I want to solve for x1 
bisectionMethod(5, 250, 0.1, std::bind(foo1, _1, 1.0)); 

// I want to also be able to use bisectionMethod with foo2 
// I want to first be able to set x1, and y1 in foo2. 
// Then I want to solve for z1 
bisectionMethod(5, 250, 0.1, std::bind(foo2, _1, 1.0, 2.0)); 

return 0; 

} 

這適用於C++ 11.使用的boost ::綁定的C++ 98

+0

請注意,佔位符被置於錯誤的位置...... – Mine

0

增壓版本:

#include <boost/bind.hpp> 
#include <boost/function.hpp> 

double bisectionMethod(double xMinimum, double xMaximum, double maxError, boost::function<double(double)>) 
{ 
    ... 
    return 0; 
} 

double foo1(double x1, double y1){return x1 * y1;} 
double foo2(double x2, double y2, double z2){return x2 * y2 * z2;} 

int main(){ 

    // I want to first be able to set y1 in foo1. 
    // Then I want to solve for x1 
    bisectionMethod(5, 250, 0.1, boost::bind(foo1, _1, y1)); 

    // I want to also be able to use bisectionMethod with foo2 
    // I want to first be able to set x1, and y1 in foo2. 
    // Then I want to solve for z1 
    bisectionMethod(5, 250, 0.1, boost::bind(foo2, x1, y1, _1)); 

    return 0; 

} 
相關問題