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

Mengapa Pengkhususan Separa Templat Fungsi Dilarang dalam C?

Susan Sarandon
Susan Sarandonasal
2024-12-06 01:50:11746semak imbas

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!

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
}

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!

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