c – 如何构造一个仿函数,用于像boost的brent_find_minima这样的算法?

c – 如何构造一个仿函数,用于像boost的brent_find_minima这样的算法?,第1张

概述我试图理解为什么带有构造函数的仿函数不能传递给算法,而没有构造函数的仿函数可以. 对于算法boost-brent_minima. 当函子没有构造函数时,示例代码工作正常: #include <boost/math/tools/minima.hpp>struct funcdouble{ double operator()(double const& x) { // return 我试图理解为什么带有构造函数的仿函数不能传递给算法,而没有构造函数的仿函数可以.

对于算法boost-brent_minima.
当函子没有构造函数时,示例代码工作正常:

#include <boost/math/tools/minima.hpp>struct funcdouble{  double operator()(double const& x)  { //    return (x + 3) * (x - 1) * (x - 1); // (x + 3)(x - 1)^2  }};int bits = std::numeric_limits<double>::digits;std::pair<double,double> r = brent_find_minima(funcdouble(),-4.,4. / 3,bits);std::cout.precision(std::numeric_limits<double>::digits10);std::cout << "x at minimum = " << r.first << ",f(" << r.first << ") = " << r.second << std::endl;

但是,当我使用构造函数生成这样的自定义函子时:

struct solver_test{    solver_test::solver_test(std::string Expression_string,std::string x_name_) : x_name(x_name_){        symbol_table.add_constants();               symbol_table.create_variable(x_name);        Expression.register_symbol_table(symbol_table);             parser.compile(Expression_string,Expression);    };    double operator()(double x) {        symbol_table.get_variable(x_name)->ref() = x;        double value = Expression.value();        return value;    };    std::string x_name;    exprtk::symbol_table<double> symbol_table;    exprtk::Expression<double> Expression;    exprtk::parser<double> parser;};int bits = std::numeric_limits<double>::digits;solver_test test_root_finder("(x + 3)(x - 1)^2","x");std::pair<double,double> r = boost::math::tools::brent_find_minima(test_root_finder,f(" << r.first << ") = " << r.second << std::endl;

我得到编译器错误C2280 – 使用brent_find_minima在行上引用已删除的函数.尝试时也会发生此错误:

std::pair<double,double> r = boost::math::tools::brent_find_minima(solver_test("(x + 3)(x - 1)^2","x"),bits);

如何在没有事先实例化的情况下传递带有构造函数的仿函数?

如果我看看以前的帖子

How do C++ functor constructors get called when used with for_each or std::transform

提供的答案似乎不适用于这种情况.

解决方法 如果我尝试,问题就变得清晰了
solver_test test_root_finder("(x + 3)(x - 1)^2","x");solver_test copy_test = test_root_finder;

因为函子没有复制构造函数,所以它不能像这样传递给算法:

std::pair<double,bits);

添加

solver_test::solver_test(const solver_test &obj) {};

让一切都好.

总结

以上是内存溢出为你收集整理的c – 如何构造一个仿函数,用于像boost的brent_find_minima这样的算法?全部内容,希望文章能够帮你解决c – 如何构造一个仿函数,用于像boost的brent_find_minima这样的算法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1243796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存