首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boost::bind将成员函数绑定到boost::bisect?

使用boost::bind将成员函数绑定到boost::bisect?
EN

Stack Overflow用户
提问于 2011-11-29 00:39:19
回答 2查看 699关注 0票数 1

我以前在使用this时遇到过问题,但现在它以某种方式工作了。

现在我有了下面的问题。在使用相同的函数调用boost::bisect之前,我需要将值绑定到成员函数中。我找到了非常好的tutorial,并且我一直在关注它,但似乎我仍然在做一些错误的事情。

首先,我创建了测试类,其中我得到了以下工作:

代码语言:javascript
复制
std::pair<double, double> result = bisect(&Func, 0.0, 1.0, TerminationCondition());
            double root = (result.first + result.second) / 2;

在那之后,我添加了绑定,因为我认为它可以工作。

代码语言:javascript
复制
 std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());

其结果是一个错误。错误:在引发“”boost::exception_detail::clone_impl>“”的实例后调用terminate。what():函数boost::math::tools::bisect中出错:boost::math::tools::bisect中没有符号更改,或者没有要查找的根,或者间隔中有多个根(f(min) = -0.0032916729090909091)。“”

无论如何,这里是class::function,由于某些原因,它不能作为绑定的成员函数工作。我以非成员的身份对它进行了测试,它工作正常。

代码语言:javascript
复制
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); 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-29 01:56:14

如果我没看错教程,它应该是:

代码语言:javascript
复制
std::pair<double, double> result =
    bisect(boost::bind(&CLASS::Function, this, _1, _2, _3),
        0.0, 1.000000, TerminationCondition());

boost::bind()的参数为:

  1. 要绑定到

的函数(对象)的名称

  1. 要传递给该对象的参数,因为函数需要它们

对于您的示例,CLASS::memberFunc()应该是一个CLASS * (可能是this,但任何CLASS *都可以)作为第一个参数,按字面意思声明,然后是后来传递给绑定对象的参数。

这些“未来”由_1_2等指定,具体取决于它们在调用时的位置。

示例:

代码语言:javascript
复制
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;
[ ... ]
票数 1
EN

Stack Overflow用户

发布于 2011-11-29 05:41:04

这段代码:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8299107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档