Rumah > pembangunan bahagian belakang > C++ > Mengapa Pengkhususan Separa Templat Fungsi Dilarang dalam C?

Mengapa Pengkhususan Separa Templat Fungsi Dilarang dalam C?

Susan Sarandon
Lepaskan: 2024-12-06 01:50:11
asal
747 orang telah melayarinya

Why are Partial Specializations of Function Templates Prohibited in C  ?

Pengkhususan Separa Templat Fungsi: Mengapa Tidak?

Adalah diketahui umum bahawa spesifikasi bahasa C melarang pengkhususan separa templat fungsi. Keputusan ini telah membingungkan ramai pembangun, yang mempersoalkan kegunaan dan rasionalnya.

Spesifikasi bahasa melarang pengkhususan separa templat fungsi kerana kesilapan. Fleksibiliti yang ditawarkan oleh pengkhususan separa boleh dicapai melalui teknik alternatif, seperti mentakrifkan fungsi sebagai ahli statik kelas.

Sebagai contoh, pertimbangkan kod berikut:

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

Sementara pengkhususan separa bagi f tidak dibenarkan, kita boleh mencapai kesan yang sama dengan mentakrifkan fungsi sebagai ahli statik sesuatu class:

void say( char const 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 berkelakuan serupa dengan pengkhususan separa templat fungsi, menyediakan mekanisme untuk mentakrifkan pelaksanaan khusus untuk gabungan hujah tertentu.

Atas ialah kandungan terperinci Mengapa Pengkhususan Separa Templat Fungsi Dilarang 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