Saya ingin tahu apa perbedaan semantik antara proposal konsep lengkap C ++ dan batasan template (misalnya, batasan seperti yang muncul di Dlang atau proposal konsep-lite baru untuk C ++ 1 tahun ).
Apa yang mampu dilakukan oleh konsep lengkap daripada yang tidak dapat dilakukan oleh batasan template?
c++
c++11
d
c++-concepts
Rayniery
sumber
sumber
Jawaban:
Bagian 3 dari proposal kendala mencakup ini secara mendalam.
Proposal konsep telah diletakkan di belakang pembakar untuk sementara waktu dengan harapan bahwa kendala (yaitu konsep-lite) dapat menyempurnakan dan diterapkan dalam skala waktu yang lebih singkat, saat ini bertujuan untuk setidaknya sesuatu dalam C ++ 14. Proposal kendala dirancang untuk bertindak sebagai transisi yang mulus ke definisi konsep selanjutnya. Batasan adalah bagian dari proposal konsep dan merupakan blok bangunan yang diperlukan dalam definisinya.
Di Design of Concept Libraries untuk C ++ , Sutton dan Stroustrup mempertimbangkan hubungan berikut:
Untuk meringkas artinya dengan cepat:
Jadi jika Anda menambahkan aksioma (properti semantik) ke batasan (properti sintaksis), Anda mendapatkan konsep.
Konsep-Lite
Proposal konsep-ringan hanya memberi kita bagian pertama, kendala, tetapi ini adalah langkah penting dan perlu menuju konsep yang lengkap.
Kendala
Batasan adalah tentang sintaks . Mereka memberi kita cara membedakan properti suatu tipe secara statis pada waktu kompilasi, sehingga kita dapat membatasi tipe yang digunakan sebagai argumen template berdasarkan properti sintaksisnya. Dalam proposal kendala saat ini, mereka diekspresikan dengan subset dari kalkulus proposisional menggunakan penghubung logis seperti
&&
dan||
.Mari kita lihat kendala dalam tindakan:
Di sini kita mendefinisikan template fungsi yang disebut
sort
. Penambahan baru adalah klausa yang dibutuhkan . Klausa require memberikan beberapa batasan pada argumen template untuk fungsi ini. Secara khusus, batasan ini mengatakan bahwa tipeCont
harus berupaSortable
tipe. Hal yang rapi adalah dapat ditulis dalam bentuk yang lebih ringkas seperti:Sekarang jika Anda mencoba meneruskan apa pun yang tidak dianggap
Sortable
untuk fungsi ini, Anda akan mendapatkan kesalahan bagus yang segera memberi tahu Anda bahwa tipe yang disimpulkan untukT
bukanlahSortable
tipe. Jika Anda telah melakukan ini di C ++ 11, Anda akan memiliki beberapa kesalahan yang mengerikan terlempar dari dalam yangsort
fungsi yang tidak masuk akal untuk siapa pun.Predikat kendala sangat mirip dengan sifat tipe. Mereka mengambil beberapa tipe argumen template dan memberi Anda beberapa informasi tentangnya. Constraints mencoba menjawab jenis pertanyaan berikut tentang type:
Namun, kendala tidak dimaksudkan untuk menggantikan sifat tipe. Sebaliknya, mereka akan bekerja sama. Beberapa sifat tipe sekarang dapat didefinisikan dalam istilah konsep dan beberapa konsep dalam istilah sifat tipe.
Contoh
Jadi yang penting tentang kendala adalah mereka tidak peduli tentang semantik sedikit pun. Beberapa contoh kendala yang baik adalah:
Equality_comparable<T>
: Memeriksa apakah tipe memiliki==
kedua operan dari tipe yang sama.Equality_comparable<T,U>
: Memeriksa apakah ada==
operan dengan kiri dan kanan dari tipe yang diberikanArithmetic<T>
: Memeriksa apakah tipenya adalah tipe aritmatika.Floating_point<T>
: Memeriksa apakah tipenya adalah tipe floating point.Input_iterator<T>
: Memeriksa apakah tipe mendukung operasi sintaksis yang harus didukung oleh iterator masukan.Same<T,U>
: Memeriksa apakah tipe yang diberikan sama.Anda dapat mencoba semua ini dengan GCC konsep-lite khusus .
Beyond Concepts-Lite
Sekarang kita membahas segala hal di luar proposal konsep-ringan. Ini bahkan lebih futuristik dari masa depan itu sendiri. Segala sesuatu mulai saat ini tampaknya akan sedikit berubah.
Aksioma
Aksioma adalah tentang semantik . Mereka menentukan hubungan, invarian, jaminan kompleksitas, dan hal-hal lain semacam itu. Mari kita lihat contohnya.
Sementara
Equality_comparable<T,U>
batasan akan memberi tahu Anda bahwa adaoperator==
yang mengambil tipeT
danU
, itu tidak memberi tahu Anda apa arti operasi itu . Untuk itu, kita akan punya aksiomaEquivalence_relation
. Aksioma ini mengatakan bahwa ketika objek dari dua tipe ini dibandingkan denganoperator==
pemberiantrue
, objek-objek ini adalah setara. Ini mungkin tampak mubazir, tetapi sebenarnya tidak. Anda dapat dengan mudah mendefinisikanoperator==
bahwa sebagai gantinya berperilaku seperti fileoperator<
. Anda akan jahat melakukan itu, tetapi Anda bisa.Contoh lainnya adalah
Greater
aksioma. Baik dan bagus untuk mengatakan dua objek dengan tipeT
dapat dibandingkan dengan operator>
dan<
, tetapi apa artinya ? TheGreater
aksioma mengatakan bahwa jika dan hanya jikax
lebih besar makay
, makay
kurang darix
. Spesifikasi yang diusulkan aksioma seperti itu terlihat seperti:Jadi aksioma menjawab jenis pertanyaan berikut:
Artinya, mereka sepenuhnya peduli dengan semantik jenis dan operasi pada jenis tersebut. Hal-hal ini tidak dapat diperiksa secara statis. Jika ini perlu dicentang, suatu jenis harus dengan cara tertentu menyatakan bahwa ia mematuhi semantik ini.
Contoh
Berikut beberapa contoh umum aksioma:
Equivalence_relation
: Jika dua objek dibandingkan==
, keduanya setara.Greater
: Kapanpunx > y
, laluy < x
.Less_equal
: Kapanpunx <= y
, lalu!(y < x)
.Copy_equality
: Untukx
dany
bertipeT
: ifx == y
, sebuah objek baru dengan tipe yang sama dibuat dengan konstruksi salinanT{x} == y
dan masihx == y
(yaitu, tidak merusak).Konsep
Sekarang konsep sangat mudah untuk didefinisikan; mereka hanyalah kombinasi dari kendala dan aksioma . Mereka menyediakan persyaratan abstrak atas sintaks dan semantik suatu tipe.
Sebagai contoh, pertimbangkan
Ordered
konsep berikut :Pertama perhatikan bahwa untuk tipe template yang
T
akanOrdered
, itu juga harus memenuhi persyaratanRegular
konsep. TheRegular
konsep adalah persyaratan yang sangat dasar yang jenisnya adalah berkelakuan baik - itu dapat dibangun, dihancurkan, disalin dan dibandingkan.Selain persyaratan tersebut, persyaratan
Ordered
yangT
memenuhi satu kendala dan empat aksioma:Ordered
Jenis harus memilikioperator<
. Ini dicentang secara statis sehingga harus ada.x
dany
dari tipeT
:x < y
memberikan pemesanan total yang ketat.x
lebih besar dariy
,y
lebih kecil darix
, dan sebaliknya.x
kurang dari atau sama dengany
,y
tidak kurang darix
, dan sebaliknya.x
lebih besar dari atau sama dengany
,y
tidak lebih besar darix
, dan sebaliknya.Menggabungkan kendala dan aksioma seperti ini memberi Anda konsep. Mereka mendefinisikan persyaratan sintaksis dan semantik untuk tipe abstrak untuk digunakan dengan algoritma. Algoritma saat ini harus mengasumsikan bahwa tipe yang digunakan akan mendukung operasi tertentu dan mengekspresikan semantik tertentu. Dengan konsep, kami dapat memastikan bahwa persyaratan terpenuhi.
Dalam desain konsep terbaru , kompilator hanya akan memeriksa bahwa persyaratan sintaksis suatu konsep dipenuhi oleh argumen template. Aksioma dibiarkan tidak dicentang. Karena aksioma menunjukkan semantik yang tidak dapat dievaluasi secara statis (atau seringkali tidak mungkin untuk diperiksa seluruhnya), penulis tipe harus secara eksplisit menyatakan bahwa tipenya memenuhi semua persyaratan konsep. Ini dikenal sebagai pemetaan konsep dalam desain sebelumnya, tetapi sejak itu telah dihapus.
Contoh
Berikut beberapa contoh konsep:
Regular
jenis dapat dibangun, dirusak, dapat disalin, dan dapat dibandingkan.Ordered
jenis dukunganoperator<
, dan memiliki total pemesanan yang ketat dan semantik pemesanan lainnya.Copyable
tipe adalah salinan yang dapat dibangun, dapat dirusak, dan jikax
sama dengany
danx
disalin, salinan juga akan dibandingkan dengany
.Iterator
jenis jenis harus terkaitvalue_type
,reference
,difference_type
, daniterator_category
yang sendiri harus memenuhi konsep-konsep tertentu. Mereka juga harus mendukungoperator++
dan dapat dibedakan.Jalan Menuju Konsep
Batasan adalah langkah pertama menuju fitur konsep lengkap C ++. Mereka adalah langkah yang sangat penting, karena menyediakan persyaratan tipe yang dapat diberlakukan secara statis sehingga kita dapat menulis fungsi dan kelas templat yang jauh lebih bersih. Sekarang kita dapat menghindari beberapa kesulitan dan keburukan
std::enable_if
dan teman metaprogramming nya.Namun, ada beberapa hal yang tidak dilakukan oleh proposal kendala:
Ini tidak memberikan bahasa definisi konsep.
Batasan bukanlah peta konsep. Pengguna tidak perlu secara khusus menjelaskan tipenya karena memenuhi batasan tertentu. Mereka secara statis diperiksa menggunakan fitur bahasa waktu kompilasi sederhana.
Implementasi template tidak dibatasi oleh batasan pada argumen template mereka. Artinya, jika template fungsi Anda melakukan sesuatu dengan objek berjenis terbatas yang seharusnya tidak dilakukan, compiler tidak memiliki cara untuk mendiagnosisnya. Proposal konsep berfitur lengkap akan dapat melakukan ini.
Proposal kendala telah dirancang secara khusus sehingga proposal konsep lengkap dapat diperkenalkan di atasnya. Dengan sedikit keberuntungan, transisi itu seharusnya menjadi perjalanan yang cukup mulus. Kelompok konsep mencari untuk memperkenalkan batasan untuk C ++ 14 (atau dalam laporan teknis segera setelahnya), sementara konsep lengkap mungkin mulai muncul sekitar C ++ 17.
sumber
Lihat juga "apa 'lite' tentang konsep lite" di bagian 2.3 dari risalah telecon Konsep (12 Maret) baru-baru ini dan catatan diskusi, yang diposting pada hari yang sama di sini: http://isocpp.org/blog/2013/03 / new-paper-n3576-sg8-concept-teleconference-minutes-2013-03-12-herb-sutter .
sumber
2 sen saya:
Proposal concept-lite tidak dimaksudkan untuk melakukan "pemeriksaan jenis" penerapan template . Yaitu, Concepts-lite akan memastikan (secara nosional) kompatibilitas antarmuka di situs instantiation template. Mengutip dari makalah: "concept lite adalah perpanjangan dari C ++ yang memungkinkan penggunaan predikat untuk membatasi argumen template". Dan itu dia. Itu tidak mengatakan bahwa tubuh template akan diperiksa (secara terpisah) terhadap predikat. Itu mungkin berarti tidak ada gagasan kelas satu tentang arketipe ketika Anda berbicara tentang konsep-ringan. archtypes, jika saya ingat dengan benar, dalam concept-heavy proposal adalah tipe yang menawarkan tidak kurang dan tidak lebih untuk memuaskan implementasi template.
concept-lite menggunakan fungsi-fungsi constexpr yang dimuliakan dengan sedikit trik sintaks yang didukung oleh compiler. Tidak ada perubahan dalam aturan pencarian.
Pemrogram tidak diharuskan untuk menulis peta konsep.
Terakhir, mengutip lagi "Proposal kendala tidak secara langsung membahas spesifikasi atau penggunaan semantik; itu ditargetkan hanya untuk memeriksa sintaks." Itu berarti aksioma tidak berada dalam ruang lingkup (sejauh ini).
sumber