(Я предполагаю, что знание Пример Абрахамса / Димова в этом вопросе.)
Предположим, что в заголовке есть какой-то сторонний код, подобный этому, который вы не можете изменить:
template<class T> void f(T); // (1) base template 1
template<class T> void f(T *); // (2) base template 2
template<> void f<>(int *); // (3) specialization of (2)
Вопрос в том:
Если бы мне дали декларации выше, как есть, Является ли это возможным для меня теперь специализировать базовый шаблон 1 для случая, когда T = int *
(например)?
Или простое объявление базового шаблона 2 подразумевает, что базовый шаблон 1 больше не может быть специализированным (по крайней мере, для указателей)?
Вы можете перегрузить (1), явно указав параметр шаблона в угловых скобках после имени функции (см. C ++ 11-Standard 14.7.3)
#include <iostream>
using namespace std;
template<class T> void f(T) // (1) base template 1
{
cout << "template<class T> void f(T)" << endl;
}
template<class T> void f(T *) // (2) base template 2
{
cout << "template<class T> void f(T *)" << endl;
}
//template<> void f<>(int *); // (3) specialization of (2)
template<> void f<int*>(int *) // (4) specialization of (1)
{
cout << "f<int*>(int *)" << endl;
}int main() {
int i;
f(&i); // calls (2) since only base-templates take part in overload resolution
return 0;
}
Вы всегда можете попробовать и потом прийти к нам. Но я не понимаю, почему это не сработает. Если T = int*
это будет работать, как вы хотите. И, следовательно, нет 2 будет параметром int* *