Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zasadadada
-27 / 8 / 1
Регистрация: 03.05.2013
Сообщений: 482
#1

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

05.07.2015, 22:46. Просмотров 716. Ответов 9
Метки нет (Все метки)

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

как заменить ветвление на переменную логического типа - C++
Я написал программу, которая показывает входит ли точка в область или нет. Я использовал ветвления, а оказывается нужно использовать...

Задача на ветвление (замена меньшего из 2-х данных чисел модулем разности...) - C++
Составьте программу,заменяющую меньшее из 2х данных чисел модулем разности,а большее модулем произведения этих чисел. Заранее...

Действовать в зависимости от типа переменной - C++
допустим есть массив в которой я хочу добавить по определённым индексам значение всех переменных передаваемой структуры. Проблема возникает...

Действие с файлом в зависимости от его типа - C++
В общем препод сказал написать программу к понедельнику, мол напишешь - поставлю зачет :D Суть программы с его слов: "Я задаю любой...

Возвращаемая информация в зависимости от типа принимающей переменной - C++
Здравствуйте! Читаю книгу "Язык программирования C++. Лекции и упражнения", и запнулся на одном моменте, который я так и не смог понять: ...

Перегрузка оператора шаблонного класса в зависимости от типа - C++
Как заставить шаблон различать тип переменной которую ему передают? Пробую определить через type_traits, но не выходит - не компилируется....

9
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
05.07.2015, 22:51 #2
Думаю есть более простое решение. Можешь привести пример и/или более подробней объяснить проблему?
0
zasadadada
-27 / 8 / 1
Регистрация: 03.05.2013
Сообщений: 482
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. Хотелось бы сделать ветвление без триггера.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
05.07.2015, 23:33 #4
Типы float и double прекрасно конвертируются друг в друга.
Если же типы пользовательские (классовые), то тут может помочь перегрузка.
Мне до сих пор не понятен смысл.
0
zasadadada
-27 / 8 / 1
Регистрация: 03.05.2013
Сообщений: 482
06.07.2015, 00:13  [ТС] #5
2 раза не писать одно и тоже.
0
goditsa8
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
06.07.2015, 00:18 #6
zasadadada, не совсем понял вопрос, может Вам спецификации шаблонов посмотреть?
0
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 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 - другим способом.
смартпоинтеры - третьим.

можно как угодно выкручивать оопнутую архитектуру классов.
2
zarko97
278 / 38 / 0
Регистрация: 11.10.2015
Сообщений: 405
03.12.2016, 21:51 #8
а в одну функцию это свести никак нельзя?
0
gru74ik
Эксперт CЭксперт С++
4197 / 1845 / 198
Регистрация: 20.02.2013
Сообщений: 4,990
Записей в блоге: 22
04.12.2016, 10:30 #9
Цитата Сообщение от zarko97 Посмотреть сообщение
а в одну функцию это свести никак нельзя?
Можно. Вчера только обсуждали.
0
zarko97
278 / 38 / 0
Регистрация: 11.10.2015
Сообщений: 405
04.12.2016, 20:57 #10
ну а без constexpr if можно(перегрузку не очень хочу делать)? 2-3 года ждать никак не могу))

Добавлено через 1 минуту
пока что придется обходиться энейбл_ифами и перегрузками
0
04.12.2016, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2016, 20:57
Привет! Вот еще темы с ответами:

Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур - C++
Сабж. Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур или... пободного рода простых для восприятия...

Различное поведение конструктора шаблонного класса в зависимости от типа параметра - C++
Здравствуйте. Возникла проблема - при попытке изменить поведение конструктора шаблонного класса (структуры) в зависимости от типа...

В зависимости от данных чисел, уменьшить или увеличить оба данных числа - C++
Даны действительные числа x, y. Если x и y отрицательны, то каждое значение заменить модулем; если отрицательно только одно из них, то оба...

Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору - C++
Здравствуйте форумчане! Ответьте пожалуйста на вопрос - возможно ли такое на С++ и если да, то как это реализовать? Имеется класс, в нём...


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

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

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