ใน C ++, SFINAE และ metaprogramming ตั้งใจหรือเป็นเพียงแค่ผลพลอยได้ของแม่แบบหรือไม่?


11

SFINAEและtemplatemetaprogramming สามารถทำสิ่งมหัศจรรย์ได้และห้องสมุดหลายแห่งก็ใช้พวกมันอย่างมาก

ในอดีตทั้งสอง "แนวคิดเกี่ยวกับเวทมนต์" เหล่านี้ได้รับการแนะนำ / สนับสนุนใน C ++ อย่างจงใจ? หรือพวกเขาเพิ่งค้นพบในภายหลังว่าเป็นผลพลอยได้ที่มีประโยชน์ (ผลิตภัณฑ์ด้านข้าง) ของtemplateการเขียนโปรแกรมต้นฉบับ?

คำตอบ:


19

เกี่ยวกับทศวรรษที่ผ่านมาหลังจากวันที่จัดงานประชุมเกิดขึ้นกับฉันพบตัวเองในผับกับเออร์วิน Unruhและอื่น ๆ น้อยและฉันถามเขาเกี่ยวกับโปรแกรมVJovic กล่าวถึง ตอนนี้เรามีเบียร์สองสามครั้งมันเป็นการประชุมที่ไม่เป็นทางการและมันอาศัยอยู่ในหัวของฉันเป็นเวลาสิบปีดังนั้นให้เอาเกลือเม็ดหนึ่ง แต่ตามความทรงจำของฉัน:

เขากล่าวว่าพวกเขาได้เพิ่มคุณสมบัติแม่แบบเพื่อให้บริการ STL ได้ดียิ่งขึ้น ตามที่เขาพูดในคณะกรรมการบางส่วน / หลายคนรู้สึกว่าพวกเขากำลังสร้างบางสิ่งบางอย่างโดยไม่ทราบว่าเต็มความสามารถ เขาสงสัยว่าสิ่งต่าง ๆ โดยเฉพาะอย่างยิ่งความเชี่ยวชาญบางส่วนทำให้เป็นภาษาทัวริง - สมบูรณ์และเขาก็มักจะทำแบบพิสูจน์อย่างเป็นทางการ แต่ไม่เคยทำเช่นนั้น

แต่คืนหนึ่งในการประชุมมาตรฐานเขากลับมาพร้อมกับโปรแกรมที่พิมพ์ตัวเลขสำคัญเป็นข้อความแสดงข้อผิดพลาด (เวอร์ชันที่ควรทำงานกับคอมไพเลอร์สมัยใหม่อยู่ที่นี่ ) ที่คำนวณในระหว่างการรวบรวม ในฐานะที่เป็นเทมเพลตเมตาโปรแกรมมันไม่ได้เป็นที่น่าประทับใจในมาตรฐานของทุกวันนี้ แต่มันเป็นครั้งแรกหลังจากทั้งหมด บางคนทำในสิ่งที่เขาคิดว่าเป็นเรื่องตลกโดยการส่งโปรแกรมอย่างเป็นทางการดังนั้นจึงกลายเป็นเอกสารมาตรฐาน ISO อย่างเป็นทางการ

ฉันจำได้ว่าฉันถามเขาโดยเฉพาะเกี่ยวกับปฏิกิริยาของ Bjarne Stroustrup ต่อรายการและตอบสนองเออร์วินล้อเลียนเขาด้วยการปิดตาด้วยมือของเขา :)

ในความเข้าใจย้อนหลังฉันเสียใจที่ฉันไม่ได้ถามโทดด์เวลด์ฮุยเซ็นผู้ซึ่งอยู่ในการประชุมครั้งนั้นด้วยว่าเขามากับเทมเพลตการแสดงออกได้อย่างไร (แน่นอนว่าเขาเป็นคนที่เก่งมากที่จะคุยด้วย) แต่ฉันอายุน้อยกว่ามากและปล่อยให้โอกาสในชีวิตหลุดลอยไป:(


+1 ประสบการณ์ที่น่าสนใจ พวกเขาพูดอะไรเกี่ยวกับ SFINAE แล้วเหรอ?
iammilind

@iammilind: ฉันคิดว่า SFINAE เป็นเพียงหนึ่งในคุณสมบัติที่เขากล่าวถึงซึ่งได้รับการเพิ่มเพื่อรองรับ STL ที่ดียิ่งขึ้นแม้ว่าชื่อเล่น "SFINAE" นั้นเป็นเพียงประกาศเกียรติคุณหลายปีหลังจากนั้น
sbi

11

ในปี 1994 ระหว่างการประชุมของคณะกรรมการมาตรฐาน c ++ อี Unruh ค้นพบว่าแม่แบบสามารถใช้ในการคำนวณบางอย่างในเวลารวบรวม เขาเขียนโปรแกรมที่พิมพ์ตัวเลขสำคัญ ส่วนที่น่าสนใจของแบบฝึกหัดนี้คือการผลิตจำนวนเฉพาะนั้นดำเนินการโดยคอมไพเลอร์ในระหว่างกระบวนการรวบรวมและไม่ใช่เวลาดำเนินการ แม้ว่าโปรแกรมนี้ไม่สามารถพกพาได้อย่างสมบูรณ์ แต่โปรแกรมก็แสดงให้เห็นว่ากลไกการสร้างอินสแตนซ์ของแม่แบบนั้นเป็นภาษาแบบเรียกซ้ำแบบดั้งเดิมที่สามารถทำการคำนวณแบบไม่สำคัญในเวลารวบรวม

ข้อความที่ตัดตอนมานี้นำมาจาก "c ++ templates" โดย Vandevoorde และ Josuttis (ตอนที่ 17)

อย่างที่คุณเห็นมันถูกค้นพบ แต่เนิ่นๆและพลังนั้นได้รับการยอมรับในทันที


2
สิ่งที่ดี. บทความประเภทนี้ที่ฉันได้อ่านบนอินเทอร์เน็ตยังไม่จำแหล่งที่มา สิ่งนี้เป็นจริงสำหรับ SFINAE ด้วยหรือไม่
iammilind

@iammilind คุณหมายถึงอะไรกับ "สิ่งนี้เป็นจริงสำหรับ SFINAE ด้วยหรือไม่"
BЈовић

1
โดยทั่วไปแล้ว SFINAE ต้องการการสนับสนุนจากคอมไพเลอร์ ดังนั้นจึงเป็นไปได้ว่าอาจไม่ได้รับการค้นพบโดยไม่ตั้งใจ
iammilind

@iammilind ฉันพบบทความของ informit ที่มีข้อความคล้ายกันจากหนังสือ: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind แก้ไขคำตอบ ฉันจะบอกว่ามันเป็นเรื่องบังเอิญเพราะคอมไพเลอร์สนับสนุนแม่แบบนั้นมี จำกัด โปรแกรมไม่ได้พกพาและฉันคิดว่ามันใช้งานได้กับคอมไพเลอร์เดียวเท่านั้น
BЈовић
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.