Аз съм малко объркан за специализацията на c ++ шаблона.
Каква е точната разлика между:
template<typename T>
T foo (T a) {
return a;
}
template<>
char* foo<char*> (char* a) {
return a;
}
и
template<typename T>
T foo (T a) {
return a;
}
char* foo<char*> (char* a) {
return a;
}
Също така - Има ли шаблон <> дефиниране на втори шаблон? / Ако е така, какво би могло да бъде използването на това?
С уважение и благодарност за всяка помощ
Отговори:
1 за отговор № 1Най- template <>
нотацията въведе пълна специализация на aшаблон: т.е. общата версия на шаблона не се използва, когато изведените параметри на шаблона са тези на пълната специализация. Въпреки това, всяко отклонение ще продължи да използва общия шаблон:
foo(17); // uses your general template
foo("hello"); // also uses your general template! T is deduced as char const*
char world[] = "world";
foo(world) // uses your specialization
По принцип това е точно кой е претоварванетобих работил! Очевидно е, че за шаблоните на класове няма претоварване и ще трябва да ги специализирате. Въпреки това, дори и за специализирани шаблони специализация е разумна: когато аргументите на шаблона са изрично посочени:
foo<char*>(world); // calls the specialization
Ако вместо това използвате претоварване, претоварването няма да се използва:
template <typename T>
void bar(T) { /*...*/ }
void bar(char*) { /*...*/ }
bar(world); // calls the bar(char*) overload
bar<char*>(world); // calls the template
По отношение на вашите две алтернативи: втората алтернатива не е легална C ++. Втората дефиниция изглежда малко като специализация, но трябва да въведете специализация, като използвате template <>
.
2 за отговор № 2
Вторият е просто невалиден синтаксис. Не можете да използвате параметър на шаблон в декларация на функция, освен ако не сте заявили, че функцията е шаблон.
Първият декларира специализация на функционалния шаблон foo
, Когато използвате foo
с параметър на шаблона char *
специализацията се използва вместо оригиналната дефиниция.