使用 boost::bind 将成员函数绑定到 boost::bisect?
Posted
技术标签:
【中文标题】使用 boost::bind 将成员函数绑定到 boost::bisect?【英文标题】:Using boost::bind to bind member-function to boost::bisect? 【发布时间】:2011-11-28 16:39:19 【问题描述】:我之前遇到过this 的问题,但现在它可以正常工作了。
现在我遇到了以下问题。在使用相同的函数调用 boost::bisect 之前,我需要将值绑定到成员函数中。我找到了很好的tutorial 并且我已经关注了它,但似乎我仍然做错了什么。
起初我创建了测试类,我在其中进行了以下工作:
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);
【问题讨论】:
【参考方案1】:如果我正确阅读了教程,应该是:
std::pair<double, double> result =
bisect(boost::bind(&CLASS::Function, this, _1, _2, _3),
0.0, 1.000000, TerminationCondition());
即boost::bind()
的参数是:
-
要绑定的函数(对象)的名称
传递给它的参数,正如函数所期望的那样
对于你的情况,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;
[ ... ]
【讨论】:
【参考方案2】:这段代码:
std::pair<double, double> result = bisect(boost::bind(&CLASS::Function,this, _1), 0.0, 1.000000, TerminationCondition());
是正确的。您收到的错误意味着 CLASS::Function 返回的内容无效。 bisect
抱怨给定区间 [0; 中的多个根(或可能没有根); 1]。 CLASS::Function
长什么样子?
【讨论】:
你能在 CLASS::Function 中设置一个断点,看看它是否得到正确的输入数字吗? 请发布您的真实 CLASS::Function。您在上面发布的那个有未配对的括号、空白 (...) 点并使用未定义的变量 var3。真的很难猜出什么是错的。您可以编辑您的答案,以便代码格式正确。 新增功能码。因此,该函数获得正确的值并按应有的方式计算总计,但不知何故,它仍然说找不到最大值或找到多个根。那么绑定有问题吗?我希望我不需要在普通 dist 中绑定项目? 您问题中的函数可以根据常量产生各种值。你确定区间[0;中有根吗? 1]? 我从标题中得到的值似乎有问题。当我对函数中的值进行硬编码时,它给了我根。以上是关于使用 boost::bind 将成员函数绑定到 boost::bisect?的主要内容,如果未能解决你的问题,请参考以下文章