/ / Кога да се използва шаблон <> в c ++ - c ++, шаблони, специализация по шаблон

Кога да използвате шаблона <> в c ++ - c ++, шаблони, шаблонна специализация

Аз съм малко объркан за специализацията на 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 * специализацията се използва вместо оригиналната дефиниция.