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!
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 }
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!