2016-10-12 11 views
6

मुझे समझ में क्यों एक निर्माता के साथ एक functor एक एल्गोरिथ्म के लिए पारित नहीं किया जा सकता, एक निर्माता के बिना एक functor हो सकता है, जबकि कोशिश कर रहा हूँ।मैं कैसे बढ़ावा के brent_find_minima की तरह एक एल्गोरिथ्म साथ प्रयोग के लिए एक functor का निर्माण करते हैं?

एल्गोरिथ्म बढ़ावा-brent_minima लिए

। उदाहरण कोड ठीक काम करता है, जब functor कोई निर्माता है:

#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; 

हालांकि, जब मैं एक निर्माता का उपयोग इस तरह एक कस्टम functor उत्पन्न करने के लिए:

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, -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; 

मैं कंपाइलर त्रुटि C2280 मिल - संदर्भ brent_find_minima साथ लाइन पर समारोह को नष्ट कर दिया। जब कोशिश कर यह त्रुटि होती है:

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

कैसे मैं एक निर्माता के साथ एक functor पारित कर सकते हैं, यह पहले से instantiating बिना?

अगर मैं पिछले पोस्ट

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

को देखो प्रदान की उत्तर देने के लिए इस मामले पर लागू होने लगते हैं नहीं है।

उत्तर

7

समस्या स्पष्ट हो जाता है कि अगर मैं

solver_test test_root_finder("(x + 3)(x - 1)^2", "x"); 
solver_test copy_test = test_root_finder; 

कोशिश क्योंकि functor कोई नकल निर्माता इसे इस तरह एल्गोरिथ्म के लिए पारित नहीं किया जा सकता है:

std::pair<double, double> r = boost::math::tools::brent_find_minima(test_root_finder, -4., 4./3, bits); 

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

जोड़ना सब कुछ ठीक कर देता है।

संबंधित मुद्दे

 संबंधित मुद्दे