Специализация шаблона функции и пример Абрахама / Димова

(Я предполагаю, что знание Пример Абрахамса / Димова в этом вопросе.)

Предположим, что в заголовке есть какой-то сторонний код, подобный этому, который вы не можете изменить:

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 больше не может быть специализированным (по крайней мере, для указателей)?

5

Решение

Вы можете перегрузить (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;
}
2

Другие решения

Вы всегда можете попробовать и потом прийти к нам. Но я не понимаю, почему это не сработает. Если T = int* это будет работать, как вы хотите. И, следовательно, нет 2 будет параметром int* *

0

По вопросам рекламы [email protected]