Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 722

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

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

Студворк — интернет-сервис помощи студентам
Подскажите, есть шаблон-функция. В неё приходит тип данных T или TT
C++
1
function(T* in, TT* out);
Может быть так, что к примеру T = float, а TT double, в таком случае нужно делать преобразование типов static_cast.
Каким образом возможно реализовать такое ветвление? Смотрел в сторону std::enable_if, но не нашёл пример с разделением float, double.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2015, 22:46
Ответы с готовыми решениями:

Ветвление в зависимости от выбранной опции
Доброго времени суток, подскажите как в командной строке организовать простой ввод данных, например 1 и 2 Еслии вводим 1 выполняется один...

Как правильно сделать ветвление в зависимости от ОС?
Мне нужно сделать не что вроде #ifdef OS_WIN // Код для винды для MSVC #elif deifned(OS_LINUX) // Код для...

Скорость выполнения программы в зависимости от типа данных
Привет всем, Мне интересно, а насколько быстрее становится программа, если для каждой переменной указывать тип данных, а не оставлять...

9
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.07.2015, 22:51
Думаю есть более простое решение. Можешь привести пример и/или более подробней объяснить проблему?
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 722
05.07.2015, 23:24  [ТС]
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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
05.07.2015, 23:33
Типы float и double прекрасно конвертируются друг в друга.
Если же типы пользовательские (классовые), то тут может помочь перегрузка.
Мне до сих пор не понятен смысл.
0
81 / 40 / 22
Регистрация: 03.05.2013
Сообщений: 722
06.07.2015, 00:13  [ТС]
2 раза не писать одно и тоже.
0
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
06.07.2015, 00:18
zasadadada, не совсем понял вопрос, может Вам спецификации шаблонов посмотреть?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.07.2015, 08:02
Цитата Сообщение от 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
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
03.12.2016, 21:51
а в одну функцию это свести никак нельзя?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
04.12.2016, 10:30
Цитата Сообщение от zarko97 Посмотреть сообщение
а в одну функцию это свести никак нельзя?
Можно. Вчера только обсуждали.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
04.12.2016, 20:57
ну а без constexpr if можно(перегрузку не очень хочу делать)? 2-3 года ждать никак не могу))

Добавлено через 1 минуту
пока что придется обходиться энейбл_ифами и перегрузками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.12.2016, 20:57
Помогаю со студенческими работами здесь

Выбрать шаблон данных в зависимости от типа подкласса
Передо мной стоит задача: вывести коллекцию элементов. Проблема в том, что это коллекция указателей на базовый класс. В одном производном...

В зависимости от типа данных произвести те или иные манипуляции с ними
Добрый день! Есть цикл,который проходит по ячейкам Excel файла. И есть несколько условий...типа Начало цикла Dim...

Как изменить цвет шрифта ячейки DataGridView в зависимости от типа данных?
Строки DataGridView содержат данные разных типов. Как задать соответствие между типом данных и цветом? Добавлено через 6 минут То...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru