C++ में ऐसा कोई ऑपरेटर नहीं है। कभी-कभी, हमें रैपर प्रकार बनाने की आवश्यकता होती है। उदाहरण के लिए, unique_ptr, shared_ptr, optional और इसी तरह के प्रकार। आमतौर, इन प्रकारों में .get नामक एक एक्सेसर मेंबर फ़ंक्शन होता है लेकिन वे ऑपरेटर-> को सीधे निहित मान तक पहुंच का समर्थन करने के लिए भी प्रदान करते हैं जैसे सामान्य पॉइंटर्स करते हैं।
समस्या यह है कि कभी-कभी हमारे पास इनमें से कुछ प्रकार एक-दूसरे में नेस्टेड होते हैं। इसका मतलब है कि हमें .get को कई बार कॉल करने की आवश्यकता है या तब तक बहुत सारे डीरेफरेंस ऑपरेटर्स की आवश्यकता होती है जब तक हम मान तक नहीं पहुंच जाते।
कुछ ऐसा:
wrapper<wrapper<std::string>> wp; wp.get().get().length(); wp.get()->length();
यह थोड़ा बदसूरत हो सकता है। यदि हम एक .get() को एरो से बदल सकते हैं, तो यह अच्छा होगा यदि हम दूसरे .get() को भी बदल सकें। इसके लिए, C++98 ने एक लॉन्ग एरो ऑपरेटर पेश किया।
wrapper<wrapper<std::string>> wp; wp--->length();
यदि हमारे पास रैपिंग की एक और परत है? बस एक लंबा एरो बनाएं।
wrapper<wrapper<wrapper<std::string>>> wp; wp----->length();
लॉन्ग एरो एक ऑपरेटर नहीं है, बल्कि कई ऑपरेटर्स का संयोजन है। इस मामले में, एक सामान्य -> ऑपरेटर और पोस्टफिक्स डिक्रीमेंट ऑपरेटर --।
इसलिए, जब हम wp---->length() लिखते हैं, तो कंपाइलर ((wp--)--)->length() देखता है।
यदि हम पोस्टफिक्स -- को डीरेफरेंस ऑपरेटर के समान परिभाषित करते हैं, तो हमें लॉन्ग एरो, और यहां तक कि लंबे एरो ऑपरेटर्स मिलते हैं:
template <typename T>
class wrapper {
public:
T* operator->() { return &t; }
T& operator--(int) { return t; }
private:
T t;
};