मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं कैसे std::map फ़ंक्शन को कॉल करने के लिए उपयोग कर सकता हूं और एक कुंजी के आधार पर उक्त कार्यों के लिए तर्क पारित कर सकता हूं।

मैं पाइथन में बनाई गई एक परियोजना का सी++ में अनुवाद कर रहा हूं, लेकिन मैं इस पर अटका हुआ हूं, और मैं वास्तव में if-elses की गड़बड़ी का सहारा नहीं लेना चाहता।

जिस तरह से मैंने पाइथन में ऐसा किया था:

return_operation = {  
    "*": Operations.multiply,  
    "^": Operations.exponent,  
    "**": Operations.exponent
    etc...
}

result = return_operation["*"](num_1, num_2)

क्या इसे पूरा करने का कोई तरीका सी ++ है? मैंने std::map का उपयोग करने का प्रयास किया है, लेकिन मुझे यह मिलता रहता है:

त्रुटि C2276 '&': बाध्य सदस्य फ़ंक्शन अभिव्यक्ति पर अवैध संचालन।

मैं अभी भी सी ++ के लिए बहुत नया हूं और मैं पूरी तरह खो गया हूं।

namespace std{
    class Calculator {

    public:
        void multiply(double num_1, double num_2) {
            cout << "MULTIPLYING!" << endl;
            // Normally it would return the result of multiplying the two nums
            // but it only outputs to the console until I can figure this out.
        }

        void initialize() {
            void (Calculator::*funcPtr)();
            funcPtr = &multiply;

            unordered_map<string, Calculator()> operator_function = {
                {"*", &multiply}
            };
        }
    };
}
c++
1
chixken_tendies 26 जिंदा 2022, 20:48
3
multiply शायद static होना चाहिए, std::function<void(double, double)> भी मदद कर सकता है।
 – 
Jarod42
26 जिंदा 2022, 20:50

2 जवाब

सबसे पहले, आप std नाम स्थान में कस्टम प्रकार नहीं जोड़ सकते। केवल मौजूदा टेम्पलेट्स की विशेषज्ञता।

दूसरा, आप unordered_map के लिए गलत मैप किए गए प्रकार का उपयोग कर रहे हैं। इसके बजाय कुछ और कोशिश करें:

class Calculator {
private:
    typedef double (Calculator::*FuncType)(double, double);

    unordered_map<string, FuncType> operator_function = {
        {"*",  &Calculator::multiply},
        {"^",  &Calculator::exponent},
        {"**", &Calculator::exponent}
        // and so on ...
    };

    double multiply(double num_1, double num_2) {
        cout << "MULTIPLYING!" << endl;
        return num_1 * num_2;
    }

    double exponent(double num_1, double num_2) {
        cout << "EXPONENT!" << endl;
        return pow(num_1, num_2);
    }

public:
    double do_math(string op, double num_1, double num_2) {
        FuncType func = operator_function[op];
        return (this->*func)(num_1, num_2);
    }
};

फिर, मानचित्र में किसी फ़ंक्शन को कॉल करने के लिए, आप यह कर सकते हैं:

Calculator calc;
...
double result = calc.do_math("*", num_1, num_2);

ऑनलाइन डेमो

वैकल्पिक रूप से, Calculator को वास्तव में इस उदाहरण में स्टेटफुल होने की आवश्यकता नहीं है, इसलिए वास्तविक Calculator ऑब्जेक्ट की आवश्यकता से बचने के लिए विधियां static हो सकती हैं:

class Calculator {
private:
    typedef double (*FuncType)(double, double);

    static unordered_map<string, FuncType> operator_function;

    static double multiply(double num_1, double num_2) {
        cout << "MULTIPLYING!" << endl;
        return num_1 * num_2;
    }

    static double exponent(double num_1, double num_2) {
        cout << "EXPONENT!" << endl;
        return pow(num_1, num_2);
    }

public:
    static double do_math(string op, double num_1, double num_2) {
        FuncType func = operator_function[op];
        return func(num_1, num_2);
    }
};
unordered_map<string, Calculator::FuncType> Calculator::operator_function = {
    {"*",  &Calculator::multiply},
    {"^",  &Calculator::exponent},
    {"**", &Calculator::exponent}
    // and so on ...
};
double result = Calculator::do_math("*", num_1, num_2);

ऑनलाइन डेमो

2
Remy Lebeau 26 जिंदा 2022, 21:50
दूसरे संस्करण में, Calculator को एक वर्ग होने की आवश्यकता नहीं है। एक नामस्थान ठीक करेगा। पहले संस्करण को विभिन्न प्रकार के कैलकुलेटर (नियमित, वैज्ञानिक, विस्तारित-सटीक, प्रोग्राम करने योग्य ..) को संभालने के लिए आसानी से अनुकूलित किया जा सकता है जबकि दूसरा नहीं कर सकता।
 – 
n. 1.8e9-where's-my-share m.
26 जिंदा 2022, 21:57

यदि आप अपने पायथन कोड का सीधा अनुवाद ढूंढ रहे हैं, तो मैं इस तरह कुछ के साथ जाऊंगा:

#include <cmath>
#include <functional>
#include <iostream>
#include <unordered_map>

int main() {
    std::unordered_map<std::string, std::function<double (double, double)>> return_operation{
      { "*", [](double a, double b) { return a * b; } },
      { "^", [](double a, double b) { return std::pow(a, b); } },
    };

    double r = return_operation["*"](5, 3); // r == 15
    std::cout << r << std::endl;
    return 0;
}

सीखने के दृष्टिकोण से, मैं पूरी तरह से रेमी लेबेउ के उत्तर की अनुशंसा करता हूं।

1
Markus Mayr 26 जिंदा 2022, 21:47