Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

คืออะไร ?-->? โอเปอเรเตอร์ใน C ++?


ไม่มีตัวดำเนินการดังกล่าวใน 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;
};