2014-02-11 2 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; 

} 
Смежные вопросы