Rumah > pembangunan bahagian belakang > C++ > Mengapakah Pengkhususan Separa Templat Fungsi Tidak Dibenarkan dalam C ?

Mengapakah Pengkhususan Separa Templat Fungsi Tidak Dibenarkan dalam C ?

Linda Hamilton
Lepaskan: 2024-12-13 07:48:11
asal
754 orang telah melayarinya

Why are Partial Specializations of Function Templates Disallowed in C  ?

Ketiadaan Pengkhususan Templat Fungsi Separa: Rasional dan Penyelesaian

Mengapakah pengkhususan separa templat fungsi dilarang dalam bahasa C? Walaupun templat utama dan pengkhususan khusus dibenarkan, pengkhususan separa yang mengekang sebahagian daripada jenis dalam parameter templat tidak dibenarkan.

Spesifikasi bahasa C secara jelas tidak membenarkan pengkhususan separa kerana ia dianggap tidak perlu. Kefungsian yang dicapai oleh pengkhususan separa boleh direplikasi menggunakan kaedah alternatif, seperti melampirkan tika fungsi individu dalam kelas atau ruang nama atau menggunakan blok kod bersyarat untuk memilih templat secara selektif.

Pertimbangkan contoh berikut, di mana pengkhususan separa bukan dibenarkan:

template<typename T, typename U>
void f() {}   //allowed!
template<>
void f<int, char>() {}   //allowed!
template<typename T>
void f<char, T>() {}   //not allowed!
template<typename T>
void f<T, int>() {}     //not allowed!
Salin selepas log masuk

Tingkah laku ini mungkin kelihatan berlawanan dengan intuitif, tetapi rasionalnya jelas. Pengkhususan separa boleh mencipta kekaburan semasa instantiasi templat dan boleh membawa kepada tingkah laku yang tidak diingini. Dengan menguatkuasakan pemisahan yang ketat antara templat utama dan pengkhususan khusus, bahasa memastikan instantiasi templat yang boleh diramal dan ditakrifkan dengan baik.

Walau bagaimanapun, ini tidak bermakna pengkhususan separa tidak berguna sama sekali. Dengan menggabungkan fungsi dalam kelas atau ruang nama, anda boleh mencapai kesan serupa dengan berkesan:

#include <iostream>
using namespace std;

void say(const char s[]) { std::cout << s << std::endl; }

namespace detail {
    template< class T, class U >
    struct F {
        static void impl() { say("1. primary template"); }
    };

    template<>
    struct F<int, char> {
        static void impl() { say("2. <int, char> explicit specialization"); }
    };

    template< class T >
    struct F< char, T > {
        static void impl() { say("3. <char, T> partial specialization"); }
    };

    template< class T >
    struct F< T, int > {
        static void impl() { say("4. <T, int> partial specialization"); }
    };
}  // namespace detail

template< class T, class U >
void f() { detail::F<T, U>::impl(); }    

int main() {
    f<char const*, double>();       // 1
    f<int, char>();                 // 2
    f<char, double>();              // 3
    f<double, int>();               // 4
}
Salin selepas log masuk

Kod ini menunjukkan cara menggunakan ahli kelas untuk meniru pengkhususan separa. Setiap instantiasi khusus fungsi disertakan dalam fungsi ahli statiknya sendiri, memberikan tahap pengkhususan yang sama tanpa melanggar sekatan bahasa. Dengan menggunakan penyelesaian ini, anda boleh mencapai kefungsian pengkhususan separa yang diingini dengan berkesan sambil mematuhi konvensyen bahasa yang ditetapkan.

Atas ialah kandungan terperinci Mengapakah Pengkhususan Separa Templat Fungsi Tidak Dibenarkan dalam 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