วิธีใดที่ดีที่สุดในการส่งผ่านshared_ptr
ประเภทที่ได้รับไปยังฟังก์ชันที่ใช้shared_ptr
ประเภทฐาน
โดยทั่วไปฉันส่งผ่านshared_ptr
s โดยการอ้างอิงเพื่อหลีกเลี่ยงสำเนาที่ไม่จำเป็น:
int foo(const shared_ptr<bar>& ptr);
แต่จะไม่ได้ผลถ้าฉันพยายามทำสิ่งที่ชอบ
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
ฉันสามารถใช้
foo(dynamic_pointer_cast<Base, Derived>(bar));
แต่ดูเหมือนว่าจะไม่เหมาะสมด้วยเหตุผลสองประการ:
dynamic_cast
ดูเหมือนว่าบิตมากเกินไปสำหรับการที่เรียบง่ายที่ได้รับการหล่อฐาน- ตามที่ฉันเข้าใจ
dynamic_pointer_cast
สร้างสำเนา (แม้ว่าจะเป็นเพียงชั่วคราว) ของตัวชี้เพื่อส่งผ่านไปยังฟังก์ชัน
มีทางออกที่ดีกว่านี้หรือไม่?
อัปเดตสำหรับลูกหลาน:
มันกลายเป็นปัญหาของไฟล์ส่วนหัวที่หายไป นอกจากนี้สิ่งที่ฉันพยายามทำต่อไปนี้ถือเป็นปฏิปักษ์ โดยทั่วไปแล้ว
ฟังก์ชั่นที่ไม่ได้ส่งผลกระทบต่อชีวิตของวัตถุ (เช่นวัตถุที่ยังคงถูกต้องสำหรับระยะเวลาของฟังก์ชั่น)
int foo(bar& b)
ควรจะใช้การอ้างอิงธรรมดาหรือตัวชี้เช่นฟังก์ชั่นที่ใช้วัตถุ (เช่นเป็นผู้ใช้ขั้นสุดท้ายของวัตถุที่กำหนด) ควรใช้โดยค่าเช่น
unique_ptr
int foo(unique_ptr<bar> b)
ผู้โทรควรstd::move
ใส่ค่าลงในฟังก์ชันฟังก์ชั่นที่ขยายอายุการใช้งานของวัตถุควรใช้โดยค่าเช่น
shared_ptr
int foo(shared_ptr<bar> b)
คำแนะนำตามปกติเพื่อหลีกเลี่ยงการอ้างอิงแบบวงกลมใช้
ดูรายละเอียดเกี่ยวกับ Back to Basicsของ Herb Sutter
shared_ptr
? ทำไมไม่มีการอ้างอิง const ของบาร์?