【问题标题】:Using boost::bind to bind member-function to boost::bisect?使用 boost::bind 将成员函数绑定到 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); 
}

【问题讨论】:

    标签: c++ boost binding bisection


    【解决方案1】:

    如果我正确阅读了教程,应该是:

    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;
    [ ... ]
    

    【讨论】:

      【解决方案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]?
      • 我从标题中得到的值似乎有问题。当我对函数中的值进行硬编码时,它给了我根。
      猜你喜欢
      • 2011-06-23
      • 2016-02-13
      • 2019-09-14
      • 2013-11-12
      • 1970-01-01
      • 2012-09-27
      • 1970-01-01
      • 2011-01-01
      • 2014-03-02
      相关资源
      最近更新 更多