Apakah CRTP banyak digunakan? dan mengapa itu / tidak? [Tutup]

11

Saya sedang berpikir tentang pola template berulang yang aneh .

Saya merasa ini cukup berguna, dan dapat disesuaikan untuk banyak tugas. Tetapi saya harus mengakui, saya tidak melihat banyak kode CRTP di alam bebas.

Apakah sulit untuk dipahami? Apakah fungsi virtual lebih mudah secara keseluruhan? Bukankah seharusnya digunakan untuk 90% kasus di mana kata kunci virtual muncul?

Coder
sumber

Jawaban:

8

Fakta sederhananya adalah bahwa banyak, jika tidak sebagian besar, pengguna C ++ sulit memahami yang vectorlebih baik daripada mallocdan free, sehingga jumlah yang tidak hanya dapat menghargai tetapi menerapkan metaprogramming template canggih tidak terlalu tinggi. Ini menyiratkan bahwa bahkan jika itu baik untuk 90% situasi, Anda akan melihatnya jauh lebih sedikit, hanya karena orang tidak tahu tentang hal itu atau bagaimana menggunakannya.

Namun, fungsi virtual memang memiliki kelebihan, yaitu, fungsi virtual jauh lebih mudah digunakan daripada CRTP. Templat C ++ terkenal karena menyebalkan tentang apa saja dan segalanya, dan model inklusi mengisap bola.

Namun, mereka [fungsi virtual] jelas lebih lambat dan kurang kuat. Misalnya, saya sekarang sedang menulis kode menggunakan CRTP, di mana Anda mewarisi kelebihan operator untuk digunakan dengan templat ekspresi. Tidak mungkin fungsi virtual dapat membuatnya bekerja.

DeadMG
sumber
1
Bukankah agak ironis bahwa fitur bahasa yang digunakan CRTP untuk menghindari penggunaan 'virtual' menyebalkan tentang 'sebenarnya' apa saja dan segalanya?
Kaiserludi
6

WTL menggunakan CRTP. Browser Chromium adalah contoh terkenal dari perangkat lunak yang menggunakan WTL, jadi saya akan mengatakan itu digunakan "di alam liar".

Tentang 90%? Itu pasti berlebihan. Apakah Anda pernah menggunakan wadah benda polimorfik? Itu adalah penggunaan polimorfisme yang sangat umum dan Anda tidak dapat melakukannya dengan CRTP karena Base<DerivedA>tidak sama dengan Base<DerivedB>.

Tamás Szelei
sumber
-5

Inilah alasan mengapa itu tidak digunakan secara lebih luas:

  1. Ini hack
  2. Sebagai peretasan, tidak dijamin Anda tidak akan mendapat masalah saat menggunakannya. Barang-barang OO normal telah digunakan oleh sejumlah besar proyek, dan ternyata berfungsi dengan baik / masalah diketahui dengan baik, CRTP hanya ditemukan di sejumlah kecil proyek, dan tidak ada data yang tersedia
  3. tidak ada alasan yang baik untuk menggunakannya - sebagian besar alasan yang diletakkan tidak valid
  4. itu dapat membuat beberapa hal lebih rumit
tp1
sumber
11
Ini pasti bukan peretasan. Perilaku ini didefinisikan dengan sangat baik, dan ada banyak penggunaannya.
DeadMG
5
Yap, seluruh STL adalah hack besar.
Abyx
dapatkah Anda mengedit jawaban Anda dan menjelaskan, mengapa ini hack?
Nick