Специализация шаблона функции с классом шаблона

Возможный дубликат:
частичная специализация шаблона функции

Я нигде не могу найти решение для своей проблемы, потому что, если я буду искать по ключевым словам, которые я найду, я найду решения, подходящие для разных проблем. Я понимаю, что это нужно было задавать раньше, просто не могу найти решение.

Предположим, у меня есть шаблон функции:

template<class any> print(any value);

Я могу специализировать это так, скажем, int:

template<> print<int>(int value)
{
std::cout << value;
}

Но теперь проблема, я хочу, чтобы это работало и с вектором. Поскольку векторный класс является классом шаблона, это становится сложным.

Специализируем функцию так:

template<class any> print<vector<any> >(vector<any> value) {}

Будет сгенерирована следующая ошибка (MinGW g ++):

FILE: error: function template partial specialization 'print<vector<any> >' is not allowed

Обратите внимание, что функция print является лишь примером.

Как я могу решить это?

4

Решение

Существует общий обходной путь, при котором функция-шаблон просто делегирует работу функциям-членам шаблона класса:

#include <vector>
#include <iostream>

template <typename T> struct helper {
static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
static void print(std::vector<T> const &value) { }
};

template <typename T>
void print (T const &value) {
// Just delegate.
helper<T>::print (value);
}int main () {
print (5);
std::vector<int> v;
print (v);
}

Однако, если вы можете прийти с простой перегрузкой функций (как предложено ecatmur и Vaughn Cato), сделайте это.

5

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

Не пытайтесь специализировать шаблоны функций. Вместо этого используйте перегрузку

void print(int value)
{
std::cout << value;
}

а также

template<class any>
void print(vector<any> value) {}
2

Частичная специализация шаблона функции не допускается, поскольку это может привести к нарушениям правила одного определения. Обычно вы можете просто использовать перегрузку:

template<class any> print(vector<any> value) {}
1
По вопросам рекламы [email protected]