वहाँ कार्यों को स्टोर करने के तरीके, समस्या है, वांछित तर्क के साथ समारोह कॉल करने के लिए सक्षम होने के लिए आप चाहते हैं पता करने के लिए कर रहे हैं वैसे भी फ़ंक्शन के हस्ताक्षर को कॉल करना, और यदि आपके पास वह जानकारी है, तो आप अलग-अलग मानचित्रों का भी उपयोग कर सकते हैं, या boost :: function से अधिक जटिल ऑब्जेक्ट का उपयोग कर सकते हैं।
class MultiFunc
{
protected:
MultiFunc() {}
public:
typedef void (*stringFunc)(const std::string&);
typedef void (*intFunc)(int);
static MultiFunc *Create(stringFunc function);
static MultiFunc *Create(intFunc function);
virtual void operator()(const string &) { throw exception(); }
virtual void operator()(int) { throw exception(); }
virtual ~MultiFunc();
};
class MultiFuncString : public MultiFunc
{
private:
stringFunc Function;
public:
MultiFuncString(stringFunc function) : Function(function) {}
virtual void operator()(const string &arg) { Function(arg); }
};
class MultiFuncInt : public MultiFunc
{
private:
intFunc Function;
public:
MultiFuncInt(intFunc function) : Function(function) {}
virtual void operator()(int arg) { Function(arg); }
};
MultiFunc *MultiFunc::Create(MultiFunc::stringFunc function)
{
return new MultiFuncString(function);
}
MultiFunc *MultiFunc::Create(MultiFunc::intFunc function)
{
return new MultiFuncInt(function);
}
void func1(const std::string& s)
{
std::cout << s << std::endl;
}
void func2(int me)
{
std::cout << me << std::endl;
}
int main()
{
map<string, MultiFunc *> a_map;
a_map["func1"] = MultiFunc::Create(&func1);
(*a_map["func1"])("Hello");
a_map["func2"] = MultiFunc::Create(&func2);
(*a_map["func2"])(3);
// Remember to delete the MultiFunc object, or use smart pointers.
}
यह आउटपुट:
Hello
3
दुर्भाग्य से,
आप काम का एक सा भी करने को तैयार कर रहे हैं और हस्ताक्षर की एक सीमित संख्या है, तो आप सिर्फ इस तरह कुछ कर सकते हैं आप टेम्पलेट वर्चुअल फ़ंक्शन नहीं बना सकते हैं या आप इसे आसानी से सामान्यीकृत कर सकते हैं।
मान लें आप नक्शे में मूल्यों और कार्यों स्टोर कर सकते हैं, आप कैसे तत्वों को मैप करने तक पहुँचने चाहते हैं? – bayda