Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Anda Mengkhususkan Sebahagian Fungsi Ahli dalam Templat C?

Bolehkah Anda Mengkhususkan Sebahagian Fungsi Ahli dalam Templat C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 18:26:02791semak imbas

Can You Partially Specialize Member Functions in C   Templates?

Pengkhususan Fungsi Ahli Templat Separa

Dalam C , tidak mungkin untuk mengkhususkan sebahagian ahli individu kelas templat. Pengkhususan templat mesti menentukan semua parameter templat.

Sebagai contoh, kod berikut tidak sah:

<code class="cpp">template <typename T>
struct X
{
    void Specialized();
};

template <typename T> // Only specializes for bool type
void X<T>::Specialized()
{
    ...
}

template <typename T> // Only specializes for float type
void X<T>::Specialized()
{
    ...
}</code>

Penyelesaian

Terdapat beberapa penyelesaian untuk mencapai tingkah laku yang diingini:

  • Pengkhususan Eksplisit:
    Anda boleh mengkhususkan keseluruhan kelas templat secara eksplisit untuk setiap gabungan argumen templat yang diingini. Contohnya:

    <code class="cpp">template <>
    void X<int, true>::Specialized()
    {
        ...
    }
    
    template <>
    void X<float, false>::Specialized()
    {
        ...
    }</code>
  • Fungsi Terlebih:
    Anda boleh mentakrifkan fungsi terlampau beban dengan nama yang sama dalam kelas templat dan menggunakan hujah templat untuk membezakan antara mereka. Contohnya:

    <code class="cpp">template <typename T>
    struct X
    {
        void Specialized(bool b)
        {
            SpecializedImpl(i2t<b>());
        }
    
    private:
        void SpecializedImpl(i2t<true>)
        {
            ...
        }
    
        void SpecializedImpl(i2t<false>)
        {
            ...
        }
    };</code>

    Dengan menghantar nilai boolean kepada fungsi terlampau beban, anda boleh mencapai pengkhususan separa untuk fungsi ahli tertentu itu.

  • Templat Berparameter :
    Anda boleh menentukan kelas templat yang berasingan untuk melaksanakan gelagat yang diingini berdasarkan parameter templat. Contohnya:

    <code class="cpp">template <typename T, bool B>
    struct SpecializedImpl
    {
        static void call()
        {
            ...
        }
    };
    
    template <typename T>
    struct X
    {
        void Specialized()
        {
            SpecializedImpl<T, B>::call();
        }
    };</code>

    Templat SpecializedImpl diparameterkan oleh kedua-dua T dan B, membolehkan anda mengkhususkannya berdasarkan nilai khusus parameter tersebut.

Pilihan penyelesaian untuk digunakan bergantung pada keperluan khusus kod dan pilihan pembangun.

Atas ialah kandungan terperinci Bolehkah Anda Mengkhususkan Sebahagian Fungsi Ahli dalam Templat 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