У меня есть функция индексатора, и я пытался специализировать ее для стандартных типов контейнеров, но получаю ошибки. Я уверен, что это либо просто, либо невозможно, но я не могу вспомнить, что именно. Я бы предпочел это как объект-функцию, но я не смог заставить это работать. Можно ли специализировать шаблонную функцию для шаблонного класса
namespace std { //declarations of predefined indexable types
template <class T, class A> class vector;
//others are here too, but all have the same issue
}
//default indexer
template <class T>
double indexer(const T& b) { //this seems to work fine
return b.getIndex();
}
// base types
template<> double indexer<char>(const char& b) { return double(b); }
//other primitives are here too, and work fine
// standard library
template<class T, class A>
double indexer<std::vector<T,A>>(const std::vector<T,A>& b)
{ return b.empty() ? 0 : indexer(*b.cbegin()); } //line with error
сообщение об ошибке:
error C2768: 'indexer' : illegal use of explicit template arguments
Я бы хотел, чтобы это была специализация против перегрузки, потому что у меня есть функция A
, которая принимает параметр шаблона объекта / указателя функции, и перегруженная функция A
, которая вызывает первый A с индексатором по умолчанию.
template<class T, class function>
double A(T a, function F) { return F(a);} //complicated
template<class T>
double A(T a) {return A(a, indexer<T>);} //default wrapper
Кажется весьма вероятным, что это дублирующий вопрос, но я не могу его найти.