Saya memutuskan untuk meningkatkan pengetahuan saya dalam meta-programming template. Saya tahu sintaks dan aturan dan bermain dengan banyak contoh dari sumber online.
Saya mengerti betapa kuatnya templat dan berapa banyak waktu kompilasi optimasi yang dapat mereka berikan, tetapi saya masih tidak bisa "berpikir dalam templat", saya sepertinya tidak tahu sendiri apakah masalah tertentu dapat diselesaikan dengan templat dan jika bisa, bagaimana mengadaptasi masalah itu ke templat.
Apakah ada beberapa sumber atau buku daring yang mengajarkan cara mengidentifikasi masalah yang paling baik diselesaikan dengan templat dan bagaimana mengadaptasi masalah itu?
Jawaban:
Buku:
Desain C ++ modern
Pemrograman Template C ++
Menjadi akrab dengan rekursi dan pemrograman fungsional adalah nilai tambah yang besar, karena itulah yang melibatkan banyak tmp. Ini turing lengkap dan pada dasarnya segala sesuatu mungkin, meskipun biasanya bermuara pada penerapan fungsi murni untuk konstanta atau menghasilkan jenis dari tipe lain.
Peringatan: tmp adalah monster jelek yang mengubah kode yang bagus menjadi spaghetti. Semakin banyak Anda menggunakannya, semakin sedikit Anda akan menyukai C ++. Itu adalah hal yang jahat.
sumber
Pelajari Haskell atau bahasa fungsional murni lainnya (Lisp, Skema, OCaml, beberapa, Anda dapat menemukan lebih banyak di Wikipedia ).
Mempertimbangkan Haskell, Anda dapat menemukan informasi lebih lanjut tentang fasilitas pemrograman ini di sini .
Pemrograman template mengikuti banyak aturan yang sama sebenarnya.
sumber
Hanya karena Anda dapat melakukan sesuatu dengan template tidak berarti Anda harus melakukannya. Secara praktis, kecuali ketika Anda mendesain Anda berpikir ini adalah pekerjaan yang luar biasa untuk templat, mungkin lebih baik tidak menggunakannya. jika Anda berpikir terlalu banyak dalam template Anda hanya membuat kode abstrak yang sama buruknya dengan fungsi raksasa tunggal.
sumber
Perlu diingat bahwa templat menjadi solusi terbaik sangat jarang. Saya hanya mendefinisikan saya sendiri sekali dalam 5 tahun terakhir, dan rekan-rekan saya yang meninjau kode itu belum pernah melakukannya. Kasus-kasus di mana template masuk akal sebagian besar sudah diterapkan di perpustakaan standar.
Untuk pemrograman generik, hal yang harus diperhatikan adalah bahwa Anda menyalin dan menempel fungsi hanya untuk membuat perubahan kecil, seperti dalam konstanta atau tipe, dan tidak dapat menemukan cara bersih untuk menggunakan sesuatu seperti pewarisan atau parameter fungsi untuk menghindari pengulangan dirimu sendiri.
Salah satu cara template yang cukup umum digunakan adalah untuk keamanan tipe, jika Anda memiliki tipe yang berperilaku sama, tetapi untuk alasan apa pun Anda tidak ingin mereka secara tidak sengaja tercampur.
Untuk perhitungan waktu kompilasi menggunakan templat, hal yang harus diperhatikan adalah perhitungan intensif sumber daya di mana semua inputnya diketahui pada waktu kompilasi, tetapi di mana input konstan yang berbeda digunakan di tempat yang berbeda di seluruh kode. Namun, perlu diingat ini akan memperlambat kompilasi Anda setiap saat, jadi seringkali lebih baik hanya mengkode hasil secara manual, jika mereka tidak terlalu sering berubah.
Beberapa advokat menggunakan templat untuk optimasi mikro seperti menghindari pencarian tabel virtual menggunakan polimorfisme statis, atau untuk loop terbuka, tetapi menurut saya kompleksitas biasanya melebihi keuntungan kinerja kecuali kode Anda sangat kritis terhadap kinerja.
sumber
Pada dasarnya, ada beberapa alasan bagus untuk menggunakan templat:
sumber
Anda pasti harus melihat ke templat di C ++! Ini akan sangat membantu Anda untuk memahami topik seperti Pola Desain dan Pemrograman Generik. Bandingkan mereka dengan apa yang ditawarkan bahasa lain kepada Anda. Tepatnya Anda harus menggunakan template khususnya dalam skenario berikut:
Berikut adalah sumber online yang bagus untuk Anda: http://en.wikipedia.org/wiki/Generic_programming#Templates_in_C.2B.2B
sumber
Indikator sederhana kapan templat akan memperbaiki kode Anda, adalah ketika Anda melihat bahwa kode Anda sering mengharuskan Anda untuk melemparkan objek ke jenis yang berbeda. Contoh yang saya temukan di kode Java saya sendiri, yang memicu saya untuk mengonversi tanda tangan metode yang ada ke templat:
Kode klien saya selalu terlihat seperti ini:
dan setiap kali saya menggunakan metode itu, saya harus memberikan hasilnya ke subclass yang benar dari tipe MsgBase. Tanda tangan metode yang ditingkatkan adalah:
Sekarang kode klien adalah:
Jadi untuk meringkas, jika Anda menemukan diri Anda melakukan banyak casting yang tampaknya tidak perlu, Anda mungkin memiliki kasus yang bagus di mana templat akan membersihkan kode Anda.
Pembaruan: cara yang lebih baik untuk menggeneralisasi pernyataan di atas:
sumber
Baru hari ini, saya menggunakan templat untuk mengimplementasikan Mesin Negara Hingga untuk lex beberapa input. Template ekspresi adalah alat yang sangat kuat untuk menerapkan konsep kode seperti itu - mereka berjalan seperti C ++ yang dioptimalkan dengan tangan dan sangat cepat, namun sangat generik dan sangat mudah untuk ditulis.
Secara umum, template paling masuk akal ketika menerapkan algoritma generik. Jika Anda tidak menerapkan algoritma generik, mereka tidak masuk akal.
sumber
Penggunaan templat yang paling umum adalah sebagai berikut:
Maka contoh umum selanjutnya adalah:
Bersama dengan penggunaan seperti ini:
Yang itu menunjukkan bagian penting dari templat, yaitu subtitusi tipe - T diganti dengan tipe float di kedua tempat yang digunakan.
sumber