ไม่มีตัวดำเนินการดังกล่าวใน C++ บางครั้ง เราจำเป็นต้องสร้างประเภทเสื้อคลุม ตัวอย่างเช่น ประเภท เช่น unique_ptr, shared_ptr, ทางเลือก และที่คล้ายกัน โดยปกติ ประเภทเหล่านี้มีฟังก์ชันสมาชิกตัวเข้าถึงที่เรียกว่า .get แต่ยังมีตัวดำเนินการ→ เพื่อรองรับการเข้าถึงโดยตรงไปยังค่าที่มีอยู่ เช่นเดียวกับที่พอยน์เตอร์ทั่วไปทำ
ปัญหาคือบางครั้งเรามีประเภทเหล่านี้สองสามประเภทซ้อนกัน ซึ่งหมายความว่าเราต้องเรียก .get หลายครั้ง หรือมีโอเปอเรเตอร์ dereference จำนวนมากจนกว่าจะถึงค่านั้น
ประมาณนี้ −
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();
ลูกศรยาวไม่ใช่ตัวดำเนินการเดียว แต่เป็นการรวมกันของตัวดำเนินการหลายตัว ในกรณีนี้ ตัวดำเนินการ -> ปกติและตัวดำเนินการลดค่า postfix --.
ดังนั้น เมื่อเราเขียน wp----→length() คอมไพเลอร์จะเห็น ((wp--)--)→length()
หากเรากำหนด postfix -- ให้เหมือนกับโอเปอเรเตอร์ dereference เราจะได้ลูกศรยาว และโอเปอเรเตอร์ลูกศรที่ยาวกว่านั้นอีก -
template <typename T> class wrapper { public: T* operator->() { return &t; } T& operator--(int) { return t; } private: T t; };