Template specialization
От: PavelCH  
Дата: 16.05.18 07:42
Оценка:
Добрый день!
Есть код:
#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; }

И я понимаю, потому что частичная специализация шаблоном запрещена.
А если очень надо? Как лучше тогда реализовать идею чтобы функция возвращала разные значения, в зависимости от типа специализации?
Нехай щастить
Re: Template specialization
От: night beast СССР  
Дата: 16.05.18 08:03
Оценка:
Здравствуйте, 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>А если очень надо? Как лучше тогда реализовать идею чтобы функция возвращала разные значения, в зависимости от типа специализации?

если очень нужно, то используй классы, для которых частичная специализация разрешена.
Re: Template specialization
От: Кодт Россия  
Дата: 16.05.18 08:15
Оценка: 2 (1)
Здравствуйте, 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;
Перекуём баги на фичи!
Re[2]: Template specialization
От: PavelCH  
Дата: 16.05.18 08:34
Оценка:
К>
К>// чтобы не копипастить в специализациях
К>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, не подключил, ошибка компиляции. А как в моем случае сделать с шаблонным параметром, чтобы был схожий эффект?
Нехай щастить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.