Форум программистов, компьютерный форум CyberForum.ru

Ветвление в зависимости от типа данных - C++

Восстановить пароль Регистрация
 
zasadadada
2 / 2 / 0
Регистрация: 03.05.2013
Сообщений: 338
05.07.2015, 22:46     Ветвление в зависимости от типа данных #1
Подскажите, есть шаблон-функция. В неё приходит тип данных T или TT
C++
1
function(T* in, TT* out);
Может быть так, что к примеру T = float, а TT double, в таком случае нужно делать преобразование типов static_cast.
Каким образом возможно реализовать такое ветвление? Смотрел в сторону std::enable_if, но не нашёл пример с разделением float, double.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2015, 22:46     Ветвление в зависимости от типа данных
Посмотрите здесь:

C++ как заменить ветвление на переменную логического типа
C++ Перегрузка оператора шаблонного класса в зависимости от типа
C++ Задача на ветвление (замена меньшего из 2-х данных чисел модулем разности...)
Действие с файлом в зависимости от его типа C++
В зависимости от данных чисел, уменьшить или увеличить оба данных числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
05.07.2015, 22:51     Ветвление в зависимости от типа данных #2
Думаю есть более простое решение. Можешь привести пример и/или более подробней объяснить проблему?
zasadadada
2 / 2 / 0
Регистрация: 03.05.2013
Сообщений: 338
05.07.2015, 23:24  [ТС]     Ветвление в зависимости от типа данных #3
C++
1
2
3
4
5
6
7
8
9
10
11
void function(T* in, TT* out, bool out_to_double){
 
   //примерная логика
   //мне известно, что типы данных разные, устанавливаю триггер
   //пишу условие
   if(out_to_double == 1){
       out[i] = static_cast<TT>( in[i] );
   }else{
       out[i] = in[i];
   }
};
В таком формате warning. Хотелось бы сделать ветвление без триггера.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
05.07.2015, 23:33     Ветвление в зависимости от типа данных #4
Типы float и double прекрасно конвертируются друг в друга.
Если же типы пользовательские (классовые), то тут может помочь перегрузка.
Мне до сих пор не понятен смысл.
zasadadada
2 / 2 / 0
Регистрация: 03.05.2013
Сообщений: 338
06.07.2015, 00:13  [ТС]     Ветвление в зависимости от типа данных #5
2 раза не писать одно и тоже.
goditsa8
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
06.07.2015, 00:18     Ветвление в зависимости от типа данных #6
zasadadada, не совсем понял вопрос, может Вам спецификации шаблонов посмотреть?
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
06.07.2015, 08:02     Ветвление в зависимости от типа данных #7
Цитата Сообщение от zasadadada Посмотреть сообщение
в таком случае нужно делать преобразование типов static_cast.
конкретно в вашем случае можно просто использовать статик_каст без всяких ветвлений.
и не заморачиваться.

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


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


Цитата Сообщение от zasadadada Посмотреть сообщение
Смотрел в сторону std::enable_if, но не нашёл пример с разделением float, double.
для начала важно понять:
техники SFINAE (enable_if, и др) используются тогда,
когда нужно по разному обрабатывать разные категории типов.

например:
мы не знаем заранее, чем будет являться Т.
но если оно окажется дробным числом (double/float),
то мы хотим обработать его одним способом.

а если оно вдруг окажется интегральным (int, short, long, etc),
то - другим способом.

а если оно ни интегральное,
и не дробное - тогда третьим способом.

обратите внимание:
я рассуждаю не о каких то конкретных T,
а о свойствах типа возможного T.

в таком случае ветвление делается так:
http://rextester.com/YOU53696

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//Title of this code
//g++  4.9.1
 
#include <iostream>
 
//--- вспомогательная структура 
// инкапсулирует расчеты 
// связанные с определением свойств типа
template<typename T>struct property
{
    enum { is_integral = std::is_integral<T>::value       };
    enum { is_floating = std::is_floating_point<T>::value };
    enum { is_other    = !is_integral && !is_floating     };
};
 
//--- макросы служат для наглядности
#define dFOR_INTEGRAL\
    typename std::enable_if<property<T>::is_integral>::type* = nullptr  
#define dFOR_FLOATING\
    typename std::enable_if<property<T>::is_floating>::type* = nullptr  
#define dFOR_OTHER\
    typename std::enable_if<property<T>::is_other>::type* = nullptr  
 
//--- не нужно вникать в то, что скрывается под макросами
// просто имейте ввиду, что данная функция только для интегральных
template<typename T, dFOR_INTEGRAL > 
void foo(T&& value)
    { std::cout<<"value = "<< value << " is integral type\n"; }
 
// а эта - для дробных
template<typename T, dFOR_FLOATING> 
void foo(T&& value)
    { std::cout<<"value = "<< value << " is floating type\n"; }
 
// а эта - для всех остальных
template<typename T, dFOR_OTHER> 
void foo(T&& value)
{
    // расскоментируйте, что бы получить ошибку компиляции
    //static_assert(!property<T>::is_other, "ERROR: T MUST BE INTERGAL OR FLOATING");
        
    std::cout<<"value is other type\n";
}
 
// не забудем удалить дефайны, они нам больше не нужны
#undef dFOR_INTEGRAL
#undef dFOR_FLOATING
#undef dFOR_OTHER
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(10);
    foo(10.5);
    
    foo(nullptr);
}

особую мощь и выразительность SFINAE преобретает при работе с классами.

например, все классы у которых есть метод clone обрабатывать одним способом.
а те, кто были унаследованы от OBJECT - другим способом.
смартпоинтеры - третьим.

можно как угодно выкручивать оопнутую архитектуру классов.
zarko97
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
03.12.2016, 21:51     Ветвление в зависимости от типа данных #8
а в одну функцию это свести никак нельзя?
gru74ik
Модератор
 Аватар для gru74ik
3108 / 1334 / 166
Регистрация: 20.02.2013
Сообщений: 3,793
Записей в блоге: 17
Вчера, 10:30     Ветвление в зависимости от типа данных #9
Цитата Сообщение от zarko97 Посмотреть сообщение
а в одну функцию это свести никак нельзя?
Можно. Вчера только обсуждали.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
Вчера, 20:57     Ветвление в зависимости от типа данных
Еще ссылки по теме:

Возвращаемая информация в зависимости от типа принимающей переменной C++
C++ Различное поведение конструктора шаблонного класса в зависимости от типа параметра
C++ Действовать в зависимости от типа переменной

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

Или воспользуйтесь поиском по форуму:
zarko97
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 10
Вчера, 20:57     Ветвление в зависимости от типа данных #10
ну а без constexpr if можно(перегрузку не очень хочу делать)? 2-3 года ждать никак не могу))

Добавлено через 1 минуту
пока что придется обходиться энейбл_ифами и перегрузками
Yandex
Объявления
Вчера, 20:57     Ветвление в зависимости от типа данных
Ответ Создать тему
Опции темы

Текущее время: 15:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru