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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Максимальное количество элементов в векторе http://www.cyberforum.ru/cpp-beginners/thread1493555.html
Насколько длинный может быть std:vector? P.S. Под словом "длинный" я подразумеваю размер от 1000000 до 1000000000 индексов.:swoon:
C++ Одномерные Массивы, Минимальное значение в массиве Помогите пожалуйста найти максимальный элемент в массиве, у меня почему -то на выходе номер элемента 0 и см элемент 0 , хотя таких нет, в чем ошибка? #include<iostream> using namespace std; void main() { const int size=10; int A={0}; int cursize; http://www.cyberforum.ru/cpp-beginners/thread1493528.html
WxDev C++ Инспектор Свойств C++
Вопрос по инспектору свойств: Почему у фрейма нельзя изменить фон? Как в коде, например увеличить высоту на 1пиксель? что это за конструкция "->" ??
C++ SetKernelObjectSecurity function
Здравствуйте, я еще новичок, поэтому не особо понимаю как юзать винапи. Просьба помочь. Есть функция: BOOL WINAPI SetKernelObjectSecurity( _In_ HANDLE Handle, _In_ SECURITY_INFORMATION SecurityInformation, _In_ PSECURITY_DESCRIPTOR SecurityDescriptor ); Просьба подсказать как ее юзать. Понятно что в main SetKernelObjectSecurity(), это элементарно. Что в скобках...
C++ Не запускается программа в графическом режиме http://www.cyberforum.ru/cpp-beginners/thread1493482.html
Здравствуйте. Захотел запустить простенькую графическую программку в Dev C++ по выводу прямой линии на экран. Подключил библиотеки graphics.h и libbgi.a, добавил команды при вызове компоновщика. Скомпилировалось нормально, но в итоге вылезло вот это (см. прикрепленный скриншот). Кто-нибудь знает, почему так происходит?
C++ Парсер для математических выражений Здравствуйте уважаемые товарищи форумчане. Я пишу интерпретатор математических выражений и, собственно, для этого, сначала перевожу выражение в обратную польскую нотацию. Уже было вроде как закончил и хотел проверить работоспособность перевода, однако CodeBlocks посчитал иначе. Приложение запускается, однако в консоль вылетает ошибка и все. Приложение виснет. Я хотел пройтись пошагово, однако это... подробнее

Показать сообщение отдельно
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
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 - другим способом.
смартпоинтеры - третьим.

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