Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengkhususkan Fungsi Templat Secara Eksplisit Dalam Kelas Templat dalam C?

Bagaimana Mengkhususkan Fungsi Templat Secara Eksplisit Dalam Kelas Templat dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-27 17:46:14922semak imbas

How to Explicitly Specialize a Template Function Within a Template Class in C  ?

Pengkhususan Eksplisit Fungsi Templat dalam Kelas Templat

Dalam C , pengkhususan eksplisit fungsi templat dalam kelas templat boleh menjadi rumit isu sintaks. Pertimbangkan coretan kod berikut:

struct tag {};

template< typename T >
struct C
{   
    template< typename Tag >
    void f( T );                 // declaration only

    template<>
    inline void f< tag >( T ) {} // ERROR: explicit specialization in non-namespace scope
};

Dalam contoh ini, pengkompil menimbulkan ralat apabila cuba mengkhususkan fungsi ahli f secara eksplisit dengan teg teg. Untuk menyelesaikan isu ini, pengkhususan eksplisit perlu dipindahkan ke luar kelas, tetapi sintaks yang sesuai tidak serta-merta jelas.

Penyelesaian yang disediakan mencadangkan menggunakan struct pembantu dengan fungsi ahli statik untuk memajukan panggilan kepada ahli khusus fungsi:

template<class T, class Tag>
struct helper {
    static void f(T);   
};

template<class T>
struct helper<T, tag1> {
    static void f(T) {}
};

template<class T>
struct C {
    // ...
    template<class Tag>
    void foo(T t) {
        helper<T, Tag>::f(t);
    }
};

Dengan pendekatan ini, pengkhususan eksplisit terkandung dalam struktur tidak bersarang, memenuhi keperluan untuk sintaks pengkhususan eksplisit.

Atas ialah kandungan terperinci Bagaimana Mengkhususkan Fungsi Templat Secara Eksplisit Dalam Kelas Templat 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