Я хочу, чтобы специализировать шаблон класса с помощью следующей функции:шаблон специализация с Шаблонным типом
template <typename T>
class Foo
{
public:
static int bar();
};
функция не имеет аргументов и возвращает результат, основанный на типе Foo. (В этом игрушечном примере мы возвращаем число байтов типа, но в реальном приложении мы хотим вернуть некоторый объект мета-данных.) специализация работает полностью определенных типов:
// specialization 1: works
template <>
int Foo<int>::bar() { return 4; }
// specialization 2: works
template <>
int Foo<double>::bar() { return 8; }
// specialization 3: works
typedef pair<int, int> IntPair;
template <>
int Foo<IntPair>::bar() { return 2 * Foo<int>::bar(); }
Однако, Я хотел бы обобщить это на типы, которые зависят от (других) параметров шаблона. Добавление следующей специализации дает ошибку во время компиляции (VS2005):
// specialization 4: ERROR!
template <>
template <typename U, typename V>
int Foo<std::pair<U, V> >::bar() { return Foo<U>::bar() + Foo<V>::bar(); }
Я предполагаю, что это не законно C++, но почему? И есть ли способ реализовать этот тип рисунка элегантно?
Заметим, однако, что вам не нужны никакие специализаций для возвращения размера T : 'static int Foo() {return sizeof (T); } '. Интересно, может ли такой шаблон не помочь вашей реальной проблеме. – UncleBens