c – 如何构造一个仿函数,用于像boost的brent_find_minima这样的
发布时间:2020-12-16 04:59:56 所属栏目:百科 来源:网络整理
导读:我试图理解为什么带有构造函数的仿函数不能传递给算法,而没有构造函数的仿函数可以. 对于算法boost-brent_minima. 当函子没有构造函数时,示例代码工作正常: #include boost/math/tools/minima.hppstruct funcdouble{ double operator()(double const x) { /
我试图理解为什么带有构造函数的仿函数不能传递给算法,而没有构造函数的仿函数可以.
对于算法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) {}; 让一切都好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |