Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengkhususkan Fungsi Ahli Secara Eksplisit dalam Templat Kelas?

Bagaimana Mengkhususkan Fungsi Ahli Secara Eksplisit dalam Templat Kelas?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-02 21:25:12742semak imbas

How to Explicitly Specialize Member Functions in Class Templates?

Pengkhususan Eksplisit Fungsi Ahli untuk Templat Kelas

Pengkhususan eksplisit fungsi ahli dalam templat kelas memerlukan templat kelas sekeliling secara eksplisit khusus juga. Kod asal dalam soalan cuba mengkhususkan fungsi ahli get_as() untuk dua kali ganda dalam konteks X kelas, tetapi ini tidak betul kerana templat kelas sekeliling ditakrifkan sebagai templat.

Untuk menyelesaikan isu ini, seseorang boleh mengkhususkan kedua-dua templat kelas dan fungsi ahli secara eksplisit, seperti yang dilihat di bawah:

template <>
template <>
void X<int>::get_as<double>()
{

}

Pendekatan ini mengkhususkan get_as fungsi ahli khusus untuk X kelas, sambil membiarkan templat kelas di sekeliling tidak dikhususkan.

Jika templat kelas di sekeliling kekal tidak dikhususkan, teknik alternatif boleh digunakan. Satu kaedah sedemikian melibatkan penggunaan lebihan beban, seperti yang digambarkan:

template <class C> class X
{
   template<typename T> struct type { };

public:
   template <class T> void get_as() {
     get_as(type<T>());
   }

private:
   template<typename T> void get_as(type<T>) {

   }

   void get_as(type<double>) {

   }
};

Dalam pendekatan ini, fungsi get_as() terlebih dimuatkan dengan dua versi: satu yang mengambil hujah generik dan satu lagi yang secara khusus mengendalikan kes untuk double. Ini membenarkan pengkhususan eksplisit bagi fungsi ahli tanpa memerlukan pengkhususan templat kelas sekeliling.

Atas ialah kandungan terperinci Bagaimana Mengkhususkan Fungsi Ahli Secara Eksplisit dalam Templat Kelas?. 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