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

Bolehkah Anda Mengkhususkan Sebahagian Fungsi Ahli dalam Templat C?

Mary-Kate Olsen
Lepaskan: 2024-11-06 18:26:02
asal
889 orang telah melayarinya

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>
Salin selepas log masuk

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>
    Salin selepas log masuk
  • 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>
    Salin selepas log masuk

    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>
    Salin selepas log masuk

    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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan