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

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

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

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

2 ответа

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

Другие вопросы по тегам