C++-এ এমন কোনো অপারেটর নেই। কখনো কখনো আমাদের র্যাপার টাইপ তৈরি করতে হয়। উদাহরণস্বরূপ, unique_ptr, shared_ptr, optional এবং অনুরূপ টাইপ। সাধারণত এই টাইপগুলোর একটি অ্যাকসেসর মেম্বার ফাংশন থাকে .get নামে কিন্তু এগুলো operator→ ও প্রদান করে যাতে কন্টেইনড ভ্যালুতে সরাসরি অ্যাক্সেস করা যায় সাধারণ পয়েন্টারদের মত।
সমস্যা হলো কখনো কখনো আমাদের এই টাইপগুলো একে অপরের ভিতরে নেস্টেড থাকে। এর মানে হচ্ছে আমাদের .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;
};