मैं यह पता लगाने की कोशिश कर रहा हूं कि मैं कैसे std::map
फ़ंक्शन को कॉल करने के लिए उपयोग कर सकता हूं और एक कुंजी के आधार पर उक्त कार्यों के लिए तर्क पारित कर सकता हूं।
मैं पाइथन में बनाई गई एक परियोजना का सी++ में अनुवाद कर रहा हूं, लेकिन मैं इस पर अटका हुआ हूं, और मैं वास्तव में if-else
s की गड़बड़ी का सहारा नहीं लेना चाहता।
जिस तरह से मैंने पाइथन में ऐसा किया था:
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}
};
}
};
}
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);
Calculator
को एक वर्ग होने की आवश्यकता नहीं है। एक नामस्थान ठीक करेगा। पहले संस्करण को विभिन्न प्रकार के कैलकुलेटर (नियमित, वैज्ञानिक, विस्तारित-सटीक, प्रोग्राम करने योग्य ..) को संभालने के लिए आसानी से अनुकूलित किया जा सकता है जबकि दूसरा नहीं कर सकता।
यदि आप अपने पायथन कोड का सीधा अनुवाद ढूंढ रहे हैं, तो मैं इस तरह कुछ के साथ जाऊंगा:
#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;
}
सीखने के दृष्टिकोण से, मैं पूरी तरह से रेमी लेबेउ के उत्तर की अनुशंसा करता हूं।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
multiply
शायदstatic
होना चाहिए,std::function<void(double, double)>
भी मदद कर सकता है।