Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
teatralaik
4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 40
1

специализация шаблона

12.01.2018, 13:51. Просмотров 248. Ответов 9
Метки нет (Все метки)

Добрый день!
Хотелось бы сделать шаблонную функцию, у которой будет различная реализация в зависимости от того является ли шаблонный класс - вещественным(т.е. double или float) или нет. Нашел копипаст, который может вернуть bool в зависимости от типа, но не могу понять как реализовать специализацию щаблона, т.к. до этого особо мета-программированием не увлекался. Получается пока что-то в этом роде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <typename T>
struct is_floating_point
{
    static const bool value;
};
 
template <typename T>
const bool is_floating_point<T>::value =
    std::numeric_limits<T>::is_specialized &&  // Is fundamental arithmetic type...
    !std::numeric_limits<T>::is_integer;       // ...that is not an integer
 
template <typename T, bool is_float = is_floating_point<T>::value>
std::string NumberToString( const T& Number ){
        return "integer";
};
 
 
template <typename T>
std::string NumberToString<T,true>( const T& Number ){
        return "float";
};
На что компилятор пишет, что частичная специализация функций не доступна. Как быть? Конечно можно использовать тупо if в теле ф-ции, но все таки хотелось бы реализовать статический полиморфизм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2018, 13:51
Ответы с готовыми решениями:

Специализация шаблона
Пытаюсь специализировать шаблон для типа float, но не получается. В чем...

Специализация шаблона
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; ...

специализация шаблона
начал разбираться с шаблонами. если есть структура, и одна функция именно с int...

Специализация шаблона
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает...

Явная специализация шаблона
Здравствуйте, подскажите, пожалуйста, почему не выполняется неявное приведение...

9
TRam_
зомбяк
713 / 670 / 212
Регистрация: 14.05.2017
Сообщений: 2,312
12.01.2018, 14:21 2
Цитата Сообщение от teatralaik Посмотреть сообщение
const bool is_floating_point<T>::value =
* * std::numeric_limits<T>::is_specialized && *// Is fundamental arithmetic type...
* * !std::numeric_limits<T>::is_integer;
Нельзя так делать. Нужно использовать http://en.cppreference.com/w/cpp/types/conjunction и http://en.cppreference.com/w/cpp/types/negation , и то, если у вас компилятор поддерживает C++17.

Добавлено через 8 минут
Подключать/отключать реализации можно с помощью http://en.cppreference.com/w/cpp/types/enable_if
0
teatralaik
4 / 4 / 5
Регистрация: 25.08.2016
Сообщений: 40
12.01.2018, 14:22  [ТС] 3
TRam_, вроде в С++11 есть http://ru.cppreference.com/w/cpp/types/is_floating_point, но проблема, что компилятор в силу существущих ограничений нужно использовать с поддержкой 98(в него даже enable_if не влезает). И как я понимаю из вашего ответа, такую магию на нем сделать не получится?
0
TRam_
зомбяк
713 / 670 / 212
Регистрация: 14.05.2017
Сообщений: 2,312
12.01.2018, 14:41 4
Цитата Сообщение от teatralaik Посмотреть сообщение
компилятор в силу существущих ограничений нужно использовать с поддержкой 98
Ну тогда нужно делать такой шаблон, который бы "ломался" (был некомпилируем) при использовании неправильного типа. Но не уверен, что возможно создать код, который бы был с ошибкой для float, но корректным для int, и при этом оказывался бы выгоднее, чем RTTI.
0
hoggy
Нарушитель
Эксперт С++
7087 / 3130 / 648
Регистрация: 15.11.2014
Сообщений: 7,209
Завершенные тесты: 1
12.01.2018, 16:25 5
Цитата Сообщение от teatralaik Посмотреть сообщение
но не могу понять как реализовать специализацию щаблона
http://rextester.com/YQK10125


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <type_traits>
#include <iostream>
#include <string>
 
template <typename T>
::std::enable_if_t<::std::is_floating_point<T>::value, ::std::string>    
NumberToString(T&&)
    { return "float"; }
 
 
template <typename T>
::std::enable_if_t<::std::is_integral<T>::value, ::std::string>    
NumberToString(T&&)
    { return "integer"; }
 
template <typename T>
::std::enable_if_t<
    !::std::is_integral<T>::value && 
    !::std::is_floating_point<T>::value, 
    ::std::string
>    
NumberToString(T&&)
    { return "other"; }
 
 
int main()
{
    struct dimmy{} d;
    
    std::cout << "floating? " << NumberToString(0.5) << '\n';
    std::cout << "integral? " << NumberToString(5)   << '\n';
    std::cout << "other? "    << NumberToString(d)   << '\n';
}
1
DrOffset
8158 / 4734 / 1159
Регистрация: 30.01.2014
Сообщений: 7,714
12.01.2018, 16:33 6
Цитата Сообщение от teatralaik Посмотреть сообщение
нужно использовать с поддержкой 98(в него даже enable_if не влезает)
В этом случае enable_if и трейтсы для определения типа можно написать самому. Это не так сложно.
Или использовать boost, там это все есть.
0
AndrSlav
65 / 53 / 14
Регистрация: 20.12.2013
Сообщений: 429
13.01.2018, 05:56 7
Подскажите почему так получается?
Пример hoggy работает
C++
1
2
3
4
template <typename T>
::std::enable_if_t<::std::is_floating_point<T>::value, ::std::string>    
NumberToString(T&&)
    { return "float"; }
а вот так дофига стремных ошибок (enable_if_t заменили на enable_if, но они отличаются только значением по умолчанию, которое здесь не используется)
C++
1
2
3
4
template <typename T>
::std::enable_if<::std::is_floating_point<T>::value, ::std::string>    
NumberToString(T&&)
    { return "float"; }
а вот так опять работает (по сути только alias сделали, а так совпадает с предыдущим примером)
C++
1
2
3
4
5
6
7
template<bool T, class U>
using Enable = typename std::enable_if<T, U>::type;
 
template <typename T>
Enable<::std::is_floating_point<T>::value, ::std::string>    
NumberToString(T&&)
    { return "float"; }
0
Peoples
1347 / 836 / 749
Регистрация: 06.02.2016
Сообщений: 2,232
Записей в блоге: 17
Завершенные тесты: 4
13.01.2018, 11:33 8
Цитата Сообщение от AndrSlav Посмотреть сообщение
а вот так дофига стремных ошибок (enable_if_t заменили на enable_if
С++14 не поддерживается, если enable_if_t ошибки даёт
0
DrOffset
8158 / 4734 / 1159
Регистрация: 30.01.2014
Сообщений: 7,714
13.01.2018, 19:29 9
Цитата Сообщение от AndrSlav Посмотреть сообщение
а так совпадает с предыдущим примером
Не совпадает же.
Где алиас:
typename std::enable_if<T, U>::type
А в другом варианте:
std::enable_if<::std::is_floating_point<T>::value, ::std::string>
Чтобы было одинаково, надо:
C++
1
2
typename ::std::enable_if<::std::is_floating_point<T>::value, ::std::string>::type
NumberToString(T&&)
1
AndrSlav
65 / 53 / 14
Регистрация: 20.12.2013
Сообщений: 429
13.01.2018, 21:17 10
Цитата Сообщение от DrOffset Посмотреть сообщение
Где алиас:
typename std::enable_if<T, U>::type
Спасибо! Совсем глаз замылился с непривычки)
0
13.01.2018, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2018, 21:17

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода:...

Специализация шаблона функции
Как сделать специализированную функцию шаблон на тип int? У меня что-то не...

Частичная специализация шаблона
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru