@ * 1001 Сентябрь *
«Простое» решение
Ответ, опубликованный 'sep', довольно хорош, вероятно, достаточно хорош для 99% разработчиков приложений, но может повторить некоторые улучшения, если он является частью интерфейса библиотеки,
Чтобы специализироваться на векторе:
template<typename C> void mySuperTempalte (std::vector<C> myCont)
{
//check type of container
//do something here
}
Это будет работать при условии, что вызывающая сторона не использует std :: vector. Если это работает достаточно хорошо для вас, чтобы специализироваться на векторе, списке и т. Д., Остановитесь здесь и просто используйте это.
Более полное решение
Во-первых, обратите внимание, что вы не можете частично специализировать шаблоны функций - вы можете создавать перегрузки. И если два или более из них совпадают в одинаковой степени, вы получите ошибки «неоднозначной перегрузки». Поэтому нам нужно сделать ровно одно совпадение в каждом случае, который вы хотите поддержать.
Один из методов для этого заключается в использовании метода enable_if - enable_if позволяет выборочно исключать перегрузки шаблонов функций из списка возможных совпадений с помощью неясного правила языка ... в основном, если какое-либо логическое выражение ложно, перегрузка «невидимый». Посмотрите SFINAE для получения дополнительной информации, если вам интересно.
* * Пример тысяча двадцать три. Этот код может быть скомпилирован из командной строки с помощью MinGW (g ++ parameterize.cpp) или VC9 (cl / EHsc parameterize.cpp) без ошибок:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
template <bool B, class T> struct enable_if {};
template <class T> struct enable_if<true, T> { typedef T type; };
template <class T, class U> struct is_same { enum { value = false }; };
template <class T> struct is_same<T,T> { enum { value = true }; };
namespace detail{
// our special function, not for strings
// use ... to make it the least-prefered overload
template <class Container>
void SpecialFunction_(const Container& c, ...){
cout << "invoked SpecialFunction() default\n";
}
// our special function, first overload:
template <class Container>
// enable only if it is a container of mutable strings
typename enable_if<
is_same<typename Container::value_type, string>::value,
void
>::type
SpecialFunction_(const Container& c, void*){
cout << "invoked SpecialFunction() for strings\n";
}
}
// wrapper function
template <class Container>
void SpecialFunction(const Container& c){
detail::SpecialFunction_(c, 0);
}
int main(){
vector<int> vi;
cout << "calling with vector<int>\n";
SpecialFunction(vi);
vector<string> vs;
cout << "\ncalling with vector<string>\n";
SpecialFunction(vs);
}
Выход:
d:\scratch>parameterize.exe calling
with vector<int> invoked
SpecialFunction() default
calling with vector<string> invoked
SpecialFunction() for strings
d:\scratch>