CRTP ใช้ไปมากน้อยแค่ไหน? และทำไมเป็น / ไม่ [ปิด]


11

ฉันกำลังคิดเกี่ยวกับรูปแบบเทมเพลตที่เกิดขึ้นซ้ำ

ฉันพบว่ามันค่อนข้างมีประโยชน์และมันก็ปรับได้ดีสำหรับงานหลายอย่าง แต่ฉันต้องยอมรับฉันไม่เห็นรหัส CRTP ส่วนมาก

เข้าใจยากไหม ฟังก์ชั่นเสมือนโดยรวมง่ายขึ้นหรือไม่ ไม่ควรใช้กับ 90% ของกรณีที่คำหลักเสมือนปรากฏขึ้น

คำตอบ:


8

ความจริงง่ายๆก็คือว่าหลายถ้าไม่ที่สุด, C ++ ผู้ใช้สามารถแทบจะไม่เข้าใจว่าvectorจะดีกว่าmallocและfreeดังนั้นจำนวนที่ไม่เพียง แต่สามารถชื่นชม แต่ใช้แม่แบบ metaprogramming ขั้นสูงไม่สูงมาก นี่ก็หมายความว่าแม้ว่ามันจะดีสำหรับ 90% ของสถานการณ์ แต่คุณจะเห็นมันน้อยกว่ามากเพราะผู้คนไม่รู้เกี่ยวกับมันหรือวิธีใช้มัน

แต่ฟังก์ชั่นเสมือนจริงจะมีข้อได้เปรียบคือหน้าที่เสมือนเป็นเรื่องง่ายกว่าที่จะใช้ CRTP เทมเพลต C ++ นั้นมีชื่อเสียงในการเป็นคนเลวร้ายเกี่ยวกับทุกสิ่งและทุกอย่าง

อย่างไรก็ตามฟังก์ชั่นเหล่านั้น [ฟังก์ชั่นเสมือน] นั้นช้ากว่าและมีพลังน้อยกว่าอย่างชัดเจน ตัวอย่างเช่นตอนนี้ฉันกำลังเขียนโค้ดโดยใช้ CRTP ซึ่งคุณได้รับโอเปอเรเตอร์โอเวอร์โหลดสำหรับใช้กับเท็มเพลตนิพจน์ ไม่มีทางที่ฟังก์ชั่นเสมือนอาจใช้งานได้


1
มันไม่ใช่เรื่องน่าขันที่ภาษาที่ใช้ภาษาที่ CRTP ใช้เพื่อหลีกเลี่ยงการใช้ 'เวอร์ชวล' นั้นเป็นเรื่องเลวร้ายเกี่ยวกับ 'ความจริง' ทุกอย่างใช่ไหม
Kaiserludi

6

WTLใช้ CRTP Chromium เบราว์เซอร์เป็นตัวอย่างที่รู้จักกันดีของซอฟต์แวร์ที่ใช้ WTL ดังนั้นฉันจึงบอกว่ามันใช้ "in the wild"

ประมาณ 90% นั่นเป็นการพูดเกินจริงอย่างแน่นอน คุณเคยใช้ภาชนะของวัตถุ polymorphic ไหม? นั่นคือการใช้งานทั่วไปมากของความแตกต่างและคุณไม่สามารถทำเช่นนั้นกับ CRTP เพราะไม่ได้เป็นเช่นเดียวกับBase<DerivedA>Base<DerivedB>


-5

นี่คือเหตุผลที่ทำไมมันไม่ได้ใช้กันอย่างแพร่หลายมากขึ้น:

  1. มันเป็นแฮ็ค
  2. ในฐานะที่เป็นแฮ็คก็ไม่รับประกันว่าคุณจะไม่ประสบปัญหาเมื่อคุณใช้งาน มีการใช้สิ่งของ OO ปกติโดยโครงการจำนวนมากและพบว่าทำงานได้อย่างถูกต้อง / ปัญหาเป็นที่รู้จักกันดี CRTP พบได้ในโครงการขนาดเล็กเท่านั้นและไม่มีข้อมูล
  3. ไม่มีเหตุผลที่ดีที่จะใช้ - เหตุผลส่วนใหญ่ที่ตั้งไว้ไม่ถูกต้อง
  4. มันสามารถทำให้บางสิ่งซับซ้อนขึ้น

11
แน่นอนที่สุดไม่ใช่แฮ็ค พฤติกรรมมีการกำหนดไว้อย่างดีและมีประโยชน์มากมาย
DeadMG

5
ใช่ทั้ง STL เป็นแฮ็คใหญ่
Abyx

คุณสามารถแก้ไขคำตอบของคุณและอธิบายว่าทำไมมันถึงเป็นแฮ็ค
Nick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.