Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Argumen Templat Lalai Tidak Boleh Digunakan untuk Templat Fungsi Ahli dalam C ?

Mengapakah Argumen Templat Lalai Tidak Boleh Digunakan untuk Templat Fungsi Ahli dalam C ?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 12:38:01895semak imbas

Why Can't Default Template Arguments Be Used for Member Function Templates in C  ?

Argumen Templat Lalai: Mengapa Terhad kepada Templat Kelas?

Dalam C , argumen templat lalai hanya dibenarkan untuk templat kelas. Sekatan ini menimbulkan persoalan mengapa hujah sedemikian tidak boleh ditakrifkan untuk templat fungsi ahli.

Pertimbangkan contoh berikut:

<code class="cpp">struct my_class {
  template<class T = int>
  void mymember(T* vec) {
    // ...
  }
};</code>

Dalam contoh ini, percubaan dibuat untuk menentukan jenis lalai untuk parameter templat T dalam templat fungsi ahli, tetapi sintaks ini tidak dibenarkan oleh C . Sebaliknya, argumen templat lalai dihadkan sepenuhnya kepada templat kelas.

Penaakulan di Sebalik Sekatan

Larangan argumen templat lalai untuk templat fungsi berpunca daripada sebab sejarah. Dalam versi awal C , fungsi berdiri bebas tidak disepadukan sepenuhnya ke dalam sistem templat bahasa. Untuk menggalakkan penggunaan templat fungsi ahli, yang dianggap lebih idiomatik, argumen templat lalai dihadkan kepada templat kelas.

Walau bagaimanapun, sekatan ini telah diiktiraf sebagai pengehadan, kerana ia tidak perlu membezakan antara templat fungsi ahli dan templat fungsi berdiri bebas. Seperti yang ditunjukkan oleh Bjarne Stroustrup dalam laporan kecacatan:

"Larangan argumen templat lalai untuk templat fungsi adalah peninggalan yang salah... [ia] benar-benar mengecewakan gaya pengaturcaraan dengan tidak perlu membuat fungsi berdiri bebas berbeza daripada fungsi ahli ."

Kemas Kini C 0x

Sebagai tindak balas kepada kebimbangan ini, C 0x memperkenalkan hujah templat lalai untuk templat fungsi berdiri bebas. Perubahan ini membolehkan lebih fleksibiliti dan ketekalan dalam pengaturcaraan templat.

Contoh

Pertimbangkan kod C 0x berikut:

<code class="cpp">template<typename Iterator, 
         typename Comp = std::less<
            typename std::iterator_traits<Iterator>::value_type>>
void sort(Iterator beg, Iterator end, Comp c = Comp()) {
  ...
}</code>

Dalam contoh ini , hujah templat lalai ditentukan untuk parameter templat Comp, membenarkan algoritma pengisihan menggunakan fungsi kurang perbandingan standard secara lalai.

Atas ialah kandungan terperinci Mengapakah Argumen Templat Lalai Tidak Boleh Digunakan untuk Templat Fungsi Ahli dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn