@sep
'Простой' решение
Ответ Написал '' Сен довольно хорошо, вероятно, достаточно для 99% разработчиков приложений, но могли бы использовать некоторое улучшение, если это часть интерфейса библиотеки, повторить:
To specialize for vector:
template<typename C> void mySuperTempalte (std::vector<C> myCont)
{
//check type of container
//do something here
}
Это будет работать при условии, что абонент не использует зЬй :: вектор.Если это работает достаточно хорошо для вас, специализироваться на вектор, список и т. Д., Тогда остановитесь здесь и просто используйте это.
Более полное решение
Во-первых, обратите внимание, что вы не можете частично специализировать шаблоны функций - вы можете создать перегрузкам. И если два или более из них совпадают с одинаковой степенью, вы получите ошибки «неоднозначной перегрузки». Поэтому мы должны сделать ровно один матч в каждом случае, который вы хотите поддержать.
Один метод для этого - использование метода enable_if - enable_if позволяет выборочно перехватывать шаблоны функций из списка возможных совпадений с использованием неясного языкового правила ... в основном, если какое-то логическое выражение ложно, перегрузка становится «невидимым». Посмотрите SFINAE для получения дополнительной информации, если вам интересно.
Пример. Этот код может быть скомпилирован из командной строки с MinGW (г ++ parameterize.cpp) или VC9 (кл/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>
Непонятно, хотите ли вы специализироваться на различном содержимом или контейнерах. Вы рассматриваете std :: string как хранимый тип неизвестного контейнера? Или вы рассматриваете std :: string как контейнер char? –