मैंने पिछले कुछ दिनों में सी ++ में फ़ंक्शन पॉइंटर्स के लिए एक सामान्यीकृत रैपर बनाने की कोशिश की है और मैंने लगभग हर एक समस्या बार को हल करने में कामयाब रहा है। इसके साथ मेरा मुख्य लक्ष्य किसी ऑब्जेक्ट को आंतरिक रूप से संग्रहीत फ़ंक्शन पॉइंटर के साथ फ़ंक्शन के रूप में कॉल करने में सक्षम होना था। यदि सूचक कहीं कहीं इंगित कर रहा था तो यह इसे सामान्य के रूप में बुलाएगा, जबकि एक शून्य सूचक केवल फ़ंक्शन को कॉल नहीं करेगा और ऐसा कुछ भी नहीं होगा जैसा कि कुछ भी नहीं हुआ। मैं मुख्य रूप से कॉलबैक फ़ंक्शन प्रयोजनों के लिए इसका उपयोग करना चाहता हूं, जहां फ़ंक्शन को कॉल किया गया था या नहीं, और शायद कोई कार्रवाई करने के लिए मैं चाहता हूं कि मुझे परवाह नहीं है। यह निम्न के साथ लगभग पूरी तरह से काम करता है:सी के + 'टेम्पलेट मान के रूप में सी के' ... 'पैरामीटर पैक का उपयोग?
template<typename T>
class Action;
template<typename TReturn, typename ... TArgs>
class Action<TReturn(TArgs...)> {
public:
//! Define a type for the Action object
typedef TReturn(*signature)(TArgs...);
//! Constructors
inline Action(const signature& pFunc = nullptr) : mPointer(pFunc) {}
inline Action(const Action& pCopy) : mPointer(pCopy.mPointer) {}
//! Operator Call
inline bool operator() (TReturn& pReturn, TArgs ... pArgs) const { if (!mPointer) return false; pReturn = mPointer(pArgs...); return true; }
//! Operators
inline Action& operator=(const Action& pCopy) { mPointer = pCopy.mPointer; return *this; }
inline Action& operator=(const signature& pFunc) { mPointer = pFunc; return *this; }
inline operator bool() const { return (mPointer != nullptr); }
private:
//! Store a pointer to the callback function
signature mPointer;
};
template<typename ... TArgs>
class Action<void(TArgs...)> {
public:
//! Define a type for the Action object
typedef void(*signature)(TArgs...);
//! Constructors
inline Action(const signature& pFunc = nullptr) : mPointer(pFunc) {}
inline Action(const Action& pCopy) : mPointer(pCopy.mPointer) {}
//! Operator Call
inline bool operator() (TArgs ... pArgs) const { if (!mPointer) return false; mPointer(pArgs...); return true; }
//! Operators
inline Action& operator=(const Action& pCopy) { mPointer = pCopy.mPointer; return *this; }
inline Action& operator=(const signature& pFunc) { mPointer = pFunc; return *this; }
inline operator bool() const { return (mPointer != nullptr); }
private:
//! Store a pointer to the callback function
signature mPointer;
};
हालांकि, मैं स्थिति है कि सबसे अधिक संभावना होगा उपयोग इस आवरण डिबग जानकारी या स्वरूपित पाठ का उत्पादन होता है की तरह लग रहा है। यह उपयोगकर्ता परिभाषित कार्यों या printf जैसे अंतर्निहित कार्यों के माध्यम से हो सकता है। printf के हस्ताक्षर के साथ मिलान करने के लिए एक कार्य की तरह बनाया जा जाएगा:
Action<int(const char*, ...)> callback = printf;
और यह एक ही तरीका है कि किसी भी अन्य कार्रवाई कैसा व्यवहार करेंगे काम करने में सक्षम हो जाएगा। मुझे जो समस्या मिल रही है वह है '...' टेम्पलेट हस्ताक्षर को किसी भी विशेषज्ञता के साथ संरेखित करने के लिए मजबूर नहीं करेगा, बल्कि पहले प्रोटोटाइप के साथ पहले जा रहा है।
मैं पूरी तरह से समझ सकता हूं कि यह क्यों काम नहीं करता है और क्यों संकलक आवश्यक वर्ग की पीढ़ी को संभालने में सक्षम नहीं होगा, लेकिन मैं उम्मीद कर रहा था कि यहां कोई व्यक्ति इसे या कुछ समान प्राप्त करने के लिए किसी भी चुस्त तरीके से जानता होगा। किसी भी मदद की बहुत सराहना की जाएगी, धन्यवाद :)
'Std :: function' का उपयोग क्यों न करें? – StoryTeller
'एक्शन' का उद्देश्य क्या है? आपके पास क्या आवश्यकता है कि आप ['std :: function'] (http://en.cppreference.com/w/cpp/utility/functional/function) का उपयोग नहीं कर सकते? 'एक्शन' को हल करने में क्या समस्या है कि 'std :: function' नहीं है? –
https://stackoverflow.com/questions/18370396/why-cant-stdfunction-bind-to-c-style-variadic- कार्यों ने कुछ टिप्पणी दी, इस बारे में लगभग कैसे प्राप्त किया जाए। मुझे लगता है कि प्रत्येक वैरिएड फ़ंक्शन के लिए, आपको मदद करने के लिए एक ठोस वर्ग की आवश्यकता होगी, और उम्मीद है कि आप जिस फ़ंक्शन को कॉल कर सकते हैं उसका एक v * संस्करण था। – mksteve