Использование boost :: bind для привязки функции-члена к boost :: bisect? - PullRequest
1 голос
/ 28 ноября 2011

Раньше у меня были проблемы с этим , но теперь он как-то работает.

Теперь у меня следующая проблема.Мне нужно связать значения в функцию-член, прежде чем я вызову boost :: bisect с той же функцией.Я нашел довольно хороший учебник и следил за ним, но мне кажется, что я все еще делаю что-то не так.

Сначала я создал тестовый класс, в котором я получил следующую работу:

std::pair<double, double> result = bisect(&Func, 0.0, 1.0, TerminationCondition());
            double root = (result.first + result.second) / 2;

После этого я добавил привязку «на лету, поскольку я думал, что она может работать»

 std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());

В результате возникла ошибка.ошибка: завершить вызов после бросания экземпляра 'boost :: exception_detail :: clone_impl>' what (): ошибка в функции boost :: math :: tools :: bisect: без изменения знака в boost :: math :: tools:: bisect, либо нет корня для поиска, либо в интервале несколько корней (f (min) = -0.0032916729090909091).

В любом случае, здесь class :: function, которая не работает как функция-членс привязкой по какой-то причине.Я проверил это как не член, и он работает

double CLASS::Function(double c)
{
/* values: m_a, m_b, m_c, m_d, and m_minus are located in .h file */

normal norm;
double temp = m_d*sqrt(c);

double total = ((1-boost::math::pdf(norm,(m_a*c+m_b)/temp))-(1 - m_c)+boost::math::pdf(norm,(m_a*c+m_b)/temp));

return (total - m_minus); 
}

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Этот код:

std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());

является правильным.Полученная ошибка означает, что возвращаемое CLASS :: Function недопустимо.bisect жалуется на множественные корни (или, возможно, отсутствие корней) в данном интервале [0;1].Как выглядит CLASS::Function

1 голос
/ 28 ноября 2011

Если я правильно прочитал учебник, он должен быть:

std::pair<double, double> result =
    bisect(boost::bind(&CLASS::Function, this, _1, _2, _3),
        0.0, 1.000000, TerminationCondition());

Т.е. параметры для boost::bind():

  1. Имя функции (объекта) дляпривязать к
  2. аргументы для передачи этому, поскольку функция ожидает их

В вашем случае, CLASS::memberFunc(), это было бы CLASS * (возможно, this, но любой CLASS * в порядке) в качестве первого, который вы в буквальном смысле заявляете как таковой, а затем параметры затем передаются связанному объекту .

.«фьючерсы» обозначаются _1, _2 и т. д., в зависимости от их положения во время вызова.

Пример:

class addthree {
private:
    int second;
public:
    addthree(int term2nd = 0) : second(term2nd) {}
    void addto(int &term1st, const int constval) {
        term1st += (term2nd + constval);
    }
}

int a;
addthree aa;
boost::function<void(int)> add_to_a = boost::bind(&addthree::addto, &aa, a, _1);
boost::function<void(void)> inc_a = boost::bind(&addthree::addto, &aa, a, 1);

a = 0 ; add_to_a(2); std::cout << a << std::endl;
a = 10; add_to_a(a); std::cout << a << std::endl;
a = 0 ; inc_a(); std::cout << a << std::endl;
[ ... ]
...