2014-02-11 5 views
1

함수를 인수로 받아들이는 bisectionMethod 함수가 있습니다. 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

그냥 추정되는 형식 매개 변수와'표준 : bind'를 사용합니다. – chris

+0

C++ 11 람다는 어떻습니까? –

+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. 부스트 작동 :: 바인드를 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; 

}