Heim > Backend-Entwicklung > C++ > Warum sind Teilspezialisierungen von Funktionsvorlagen in C verboten?

Warum sind Teilspezialisierungen von Funktionsvorlagen in C verboten?

Susan Sarandon
Freigeben: 2024-12-06 01:50:11
Original
748 Leute haben es durchsucht

Why are Partial Specializations of Function Templates Prohibited in C  ?

Partielle Spezialisierung von Funktionsvorlagen: Warum nicht?

Es ist bekannt, dass die C-Sprachspezifikation eine teilweise Spezialisierung von Funktionsvorlagen verbietet. Diese Entscheidung hat viele Entwickler verwirrt, die ihre Nützlichkeit und Begründung in Frage stellen.

Die Sprachspezifikation verbietet aufgrund eines Versehens eine teilweise Spezialisierung von Funktionsvorlagen. Die durch die teilweise Spezialisierung gebotene Flexibilität kann durch alternative Techniken erreicht werden, beispielsweise durch die Definition der Funktion als statisches Mitglied einer Klasse.

Betrachten Sie beispielsweise den folgenden Code:

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!
Nach dem Login kopieren

While Eine teilweise Spezialisierung von f ist nicht zulässig. Wir können einen ähnlichen Effekt erzielen, indem wir die Funktion als statisches Mitglied einer Klasse definieren:

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
}
Nach dem Login kopieren

Dieser Code verhält sich ähnlich wie eine teilweise Spezialisierung von Funktionsvorlagen, die einen Mechanismus zum Definieren spezialisierter Implementierungen für bestimmte Argumentkombinationen bereitstellt.

Das obige ist der detaillierte Inhalt vonWarum sind Teilspezialisierungen von Funktionsvorlagen in C verboten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage