Di C ++, apakah SFINAE dan metaprogramming disengaja atau hanya produk sampingan dari template?


11

SFINAE dan templatemetaprogramming dapat melakukan hal-hal indah dan banyak perpustakaan juga menggunakannya secara signifikan.

Secara historis kedua "konsep ajaib" ini sengaja diperkenalkan / didukung dalam C ++? Atau mereka kemudian ditemukan sebagai produk sampingan yang berguna (produk samping) dari templatepemrograman asli ?

Jawaban:


19

Sekitar satu dekade yang lalu setelah hari konferensi saya kebetulan menemukan diri saya di sebuah pub dengan Erwin Unruh dan beberapa orang lain dan saya bertanya kepadanya tentang program yang disebutkan VJovic . Kami memiliki beberapa gelas bir pada saat itu, itu adalah pertemuan tidak resmi, dan itu tinggal di kepalaku selama satu dekade, jadi ambil ini dengan sebutir garam, tetapi menurut ingatanku:

Dia mengatakan bahwa mereka telah menambahkan fitur template untuk melayani STL dengan lebih baik. Menurutnya, beberapa orang di panitia merasa bahwa mereka menciptakan sesuatu tanpa mengetahui kemampuan penuhnya. Dia sendiri curiga bahwa semua templat, terutama spesialisasi parsial, merupakan bahasa Turing-lengkap, dan dia selalu bermaksud melakukan bukti formal tentang itu, tetapi tidak pernah sempat melakukannya.

Alih-alih pada suatu malam pada pertemuan standardisasi, dia datang dengan program yang mencetak bilangan prima sebagai pesan kesalahan (versi yang seharusnya bekerja dengan kompiler modern ada di sini ) yang ia hitung selama kompilasi. Sebagai program meta templat, program ini tidak terlalu mengesankan menurut standar saat ini, tetapi ini adalah yang pertama. Seseorang membuat lelucon yang dianggapnya dengan secara resmi menyerahkan program sehingga menjadi dokumen standardisasi ISO resmi.

Saya ingat bahwa saya secara khusus bertanya kepadanya tentang reaksi Bjarne Stroustrup terhadap program tersebut, dan sebagai tanggapan Erwin menirunya dengan menutup matanya dengan tangannya. :)

Di belakang saya menyesal saya tidak bertanya kepada Todd Veldhuizen , yang juga hadir di konferensi itu, bagaimana dia menghasilkan template ekspresi . (Dia tentu saja orang yang baik untuk diajak bicara.) Tetapi saya jauh lebih muda daripada, dan membiarkan kesempatan seumur hidup berlalu begitu saja.:(


+1, pengalaman menarik. Apakah mereka membicarakan sesuatu tentang SFINAE?
iammilind

@ iammilind: Saya pikir SFINAE hanyalah salah satu fitur yang ia sebutkan yang ditambahkan untuk mendukung STL dengan lebih baik, meskipun moniker "SFINAE" baru diciptakan bertahun-tahun setelah itu.
sbi

11

Pada tahun 1994 selama pertemuan komite standardisasi c ++, E. Unruh menemukan bahwa templat dapat digunakan untuk menghitung sesuatu pada waktu kompilasi. Dia menulis sebuah program yang mencetak bilangan prima. Bagian yang menarik dari latihan ini adalah bahwa produksi bilangan prima dilakukan oleh kompiler selama proses kompilasi dan bukan pada saat run time. Meskipun program ini tidak sepenuhnya portabel, program ini memang menunjukkan bahwa mekanisme instantiasi template adalah bahasa rekursif primitif yang dapat melakukan perhitungan non-sepele pada waktu kompilasi.

Kutipan ini diambil dari "c ++ templates" oleh Vandevoorde dan Josuttis (bab 17).

Seperti yang Anda lihat, itu ditemukan lebih awal dan kekuatannya langsung dikenali.


2
Bagus Artikel semacam ini yang saya baca di internet juga, tidak ingat sumbernya. Apakah ini juga berlaku untuk SFINAE?
iammilind

@ iammilind Apa maksudmu dengan "Apakah ini juga berlaku untuk SFINAE?"
BЈовић

1
SFINAE umumnya membutuhkan dukungan dari kompiler. Jadi mungkin saja, itu mungkin belum ditemukan secara tidak sengaja.
iammilind

@ iammilind Saya menemukan artikel informan yang memiliki teks serupa dari buku: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@ iammilind Diedit jawabannya. Saya akan mengatakan itu tidak sengaja, karena dukungan kompiler untuk template terbatas. Program ini tidak portabel, dan saya pikir itu hanya bekerja pada satu kompiler
BЈовић
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.