के सदस्य-समारोह और सूचक के लिए दोनों सूचक ले रही है मैं निम्नलिखित कोड आधार है:समारोह स्थिरांक सदस्य समारोह
template <typename Type>
class SomeClass {
public:
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...)> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
};
यह काम करता है जब मैं एक सदस्य-कार्य करने के लिए एक सूचक पारित (गैर स्थिरांक)। हालांकि, अगर मैं एक स्थिरांक सदस्य-कार्य करने के लिए एक सूचक पास करना चाहते हैं, यह एक संकलन त्रुटि में परिणाम है और मैं ऊपर समारोह नकल करना होगा इस कोड प्राप्त करने के:
template <typename Type>
class SomeClass {
public:
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...)> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
template <typename ReturnType, typename... Params>
void register_function(const std::pair<std::string, ReturnType (Type::*)(Params...) const> fct) {
auto f = [fct](Params... params) -> ReturnType { return (Type().*fct.second)(std::ref(params)...); }
// ...
}
};
अब, मैं दोनों const- पारित कर सकते हैं सदस्य-कार्य और गैर-सदस्य-कार्य-कार्य। लेकिन, अब, कोड डुप्लिकेट है और रखरखाव कम हो गया है।
क्या इन दोनों कार्यों को एक कॉन्स-सदस्य-फ़ंक्शंस और गैर-कॉन्स्ट-सदस्य-फ़ंक्शंस दोनों को फ़ंक्शन में विलय करने का कोई तरीका है?
महत्वपूर्ण नोट: मुझे वास्तव में पैरामीटर के रूप में एक सूचक कार्य लेना चाहिए (कोई std :: function)।
संपादित करें: मैंने थोड़ा और कोड जोड़ा है। फ़ंक्शंस के अंदर, मैं सदस्य फ़ंक्शन हस्ताक्षर (समान रिटर्न प्रकार और पैरा) से मेल खाता बंद करता हूं। यह बंद संग्रहीत और प्रतिबिंब बनाने के लिए बाद में इस्तेमाल किया जाएगा (more here)
क्यों नहीं बस 'टेम्पलेट शून्य register_function (मज़ा एफसीटी)'? –
fredoverflow
मैंने अपने प्रश्न को थोड़ा और कोड के साथ अपडेट किया है। लैम्बडास के अंदर, मैं std :: bind को कॉल कर सकता हूं या किसी नए ऑब्जेक्ट उदाहरण पर सदस्य फ़ंक्शन पॉइंटर का सीधे उपयोग कर सकता हूं। यही कारण है कि मुझे वास्तव में रिटर्नटाइप और पैराम्स टाइपनामों तक पहुंचने की आवश्यकता है। –
क्या यह आपका पूरा कोडबेस है? lol वास्तव में –