Добрый день!
Есть
код:
#include <iostream>
template<typename T, unsigned N> struct a {
T data[N];
};
template<typename T> int get() { return 0; }
template<> int get<int>() { return 1; }
template<> int get<char>() { return 2; }
template<class T, unsigned N> int get<a<T,N>>() { return 3; }
int main()
{
a<char, 10> a1;
std::cout << get<int>() << "\n";
std::cout << get<char>() << "\n";
std::cout << get<decltype(a1)>() << "\n";
}
Ругается "function template partial specialization 'get<a<T, N> >' is not allowed" на строке
template<class T, unsigned N> int get<a<T,N>>() { return 3; }
И я понимаю, потому что частичная специализация шаблоном запрещена.
А если очень надо? Как лучше тогда реализовать идею чтобы функция возвращала разные значения, в зависимости от типа специализации?
Здравствуйте, PavelCH, Вы писали:
PCH>Ругается "function template partial specialization 'get<a<T, N> >' is not allowed" на строке
PCH>PCH>template<class T, unsigned N> int get<a<T,N>>() { return 3; }
PCH>
PCH>И я понимаю, потому что частичная специализация шаблоном запрещена.
PCH>А если очень надо? Как лучше тогда реализовать идею чтобы функция возвращала разные значения, в зависимости от типа специализации?
если очень нужно, то используй классы, для которых частичная специализация разрешена.
Здравствуйте, PavelCH, Вы писали:
PCH>А если очень надо? Как лучше тогда реализовать идею чтобы функция возвращала разные значения, в зависимости от типа специализации?
// чтобы не копипастить в специализациях
template<int I> struct int_ { static constexpr int value = I; };
template<typename T> struct getter : int_<0> {};
template<> struct getter<int> : int_<1> {};
template<> struct getter<char> : int_<2> {};
template<class T, unsigned N> struct getter<a<T,N>> : int_<3> {};
// дальше так
template<typename T> int get() { return getter<T>::value; }
// или так
template<typename T> constexpr int value = getter<T>::value;
К>К>// чтобы не копипастить в специализациях
К>template<int I> struct int_ { static constexpr int value = I; };
К>template<typename T> struct getter : int_<0> {};
К>template<> struct getter<int> : int_<1> {};
К>template<> struct getter<char> : int_<2> {};
К>template<class T, unsigned N> struct getter<a<T,N>> : int_<3> {};
К>// дальше так
К>template<typename T> int get() { return getter<T>::value; }
К>// или так
К>template<typename T> constexpr int value = getter<T>::value;
К>
А можно как-то сделать так, чтобы
template<class T, unsigned N> struct getter<a<T,N>> : int_<3> {};
Объявлялось в другом файле cpp (другой модуль трансляции). Почему я выбрал специализации — потому что можно сделать так
template<typename T> int get();
template<> int get<int>() { return 1; }
А в другом файле, например test2.cpp написать
template<typename T> int get();
template<> int get<char>() { return 2; }
И все будет работать корректно. Подключил файл test2.cpp к проекту — результат get<char>() возвращает 2, не подключил, ошибка компиляции. А как в моем случае сделать с шаблонным параметром, чтобы был схожий эффект?