जवाबों:
आपके पास एक समान सिंटैक्स है, सिवाय इसके कि आप सूचक से पहचानकर्ता को हटा दें:
using FunctionPtr = void (*)();
यहाँ एक उदाहरण है
यदि आप "बदसूरती दूर करना" चाहते हैं, तो कोशिश करें कि Xeo ने क्या सुझाव दिया:
#include <type_traits>
using FunctionPtr = std::add_pointer<void()>::type;
और यहाँ एक और डेमो है ।
:(
using FunctionPtr = AddPointer<void()>;
;)
add_pointer<void()>::type
: यहां सुझाव का उपयोग करते हुए: group.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… आप लिख सकते हैं pointer<function<void>>
।
"कुरूपता" को भी दूर किया जा सकता है यदि आप एक सूचक टाइप करने वाले से बचते हैं:
void f() {}
using Function_t = void();
Function_t* ptr = f;
ptr();
*
बाद में भूल जाऊंगा और भ्रमित करने वाली त्रुटियां प्राप्त करूंगा ।
आप एक चाहते हैं type-id
, जो अनिवार्य रूप से एक घोषणा के समान है, सिवाय इसके कि आप हटाएं declarator-id
। declarator-id
आम तौर पर एक पहचानकर्ता है, और नाम आप बराबर घोषणा में घोषित कर रहे हैं।
उदाहरण के लिए:
int x
declarator-id
है x
तो बस इसे हटाने:
int
इसी तरह:
int x[10]
निकालें x
:
int[10]
अपने उदाहरण के लिए:
void (*FunctionPtr)()
यहाँ declarator-id
है FunctionPtr
। तो बस इसे पाने के लिए इसे हटा दें type-id
:
void (*)()
यह काम करता है क्योंकि दिए गए type-id
आप हमेशा विशिष्ट रूप से निर्धारित कर सकते हैं जहां पहचानकर्ता एक घोषणा बनाने के लिए जाएगा। मानक में 8.1.1 से:
[टाइप-आईडी] में विशिष्ट स्थान की पहचान करना संभव है जहां निर्माण [घोषणा] होने पर पहचानकर्ता प्रकट होगा। नामित प्रकार तब काल्पनिक पहचानकर्ता के प्रकार के समान है।
कैसे स्पष्टता के लिए इस वाक्यविन्यास के बारे में? (नोट डबल कोष्ठक)
void func();
using FunctionPtr = decltype((func));
एक अन्य दृष्टिकोण ऑटो रिटर्न प्रकार का उपयोग कर रिटर्न रिटर्न प्रकार के साथ हो सकता है।
using FunctionPtr = auto (*)(int*) -> void;
यह कुछ बताने में सक्षम होने का तर्कपूर्ण लाभ है एक फ़ंक्शन ptr जब उपनाम "ऑटो (*)" से शुरू होता है और यह पहचानकर्ता नामों से बाधित नहीं होता है।
तुलना
typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);
साथ में
using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;
डिस्क्लेमर: मैंने इसे बीन डीन की "इजीइंग इन मॉडर्न सी ++" टॉक से लिया
using
वास्तव में बहुत आत्मविश्वास , विशेष रूप से क्योंकि फ़ंक्शन पॉइंटर आइडेंटिफ़ायर आमतौर पर एकtypedef
बयान के बीच में रहते हैं और सामने की ओर बढ़ते हैंusing
। कम से कम मैं वहीं खो गया हूं।