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

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

Войти
Регистрация
Восстановить пароль
 
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
#1

Безопасное приведение - C++

27.10.2010, 18:32. Просмотров 608. Ответов 8
Метки нет (Все метки)

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

Вышло как-то так. А как бы сделали вы?

И еще очень интересный вопрос - почему safe_cast - ключевое слово (как минимум в MSVS)?

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
#include <iostream>
#include <stdexcept>
 
template<class T1, class T>
T1 safe_cast (const T& elem)
{
    T1 val=static_cast<T1>(elem);
    if(val!=elem)
    {
        throw std::runtime_error("Unsafe cast!");
    }
    return val;
}
 
int main()
{
    int f=220;
    try
    {
        int s=safe_cast<char>(f);
        std::cout<<s<<'\n';
    }
    catch(const std::exception& e)
    {
        std::cerr<<e.what()<<'\n';
    }
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2010, 18:32     Безопасное приведение
Посмотрите здесь:

Безопасное использование итератора С++ - C++
перебираем в цикле контейнер: for (auto it = A.begin(); it != A.end(); ++it) потом где то внутри удаляем его элемент, при чем не...

Безопасное использование вектора в двух потоках - C++
Это продолжение этой темы , но уже немного другая проблема. Работаю с классом , который создаёт объекты через shared_ptr и заносит их в...

Опишите безопасное ослабление правил для типов аргументов замещаемых функций - C++
Здорова! Есть еще задачка запутанная: Предположим, что правила проверки типов для аргументов ослаблены аналогично правилам для типов...

Приведение типов - C++
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName; string LastName; int year;

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

Динамическое приведение - C++
Добрый день вот код) В низу проблема) #ifndef SHAPE_H #define SHAPE_H class Shape { public: Shape ();

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.10.2010, 18:35     Безопасное приведение #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Lavroff Посмотреть сообщение
То есть чтобы определяло ужимание и выдавало ошибку.
Сравнивать размер с помощью sizeof?

Цитата Сообщение от Lavroff Посмотреть сообщение
И еще очень интересный вопрос - почему safe_cast - ключевое слово (как минимум в MSVS)?
Может опять что-нибудь из нового стандарта?
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.10.2010, 18:37  [ТС]     Безопасное приведение #3
Nameless One, В 8-ой студии из нового стандарта? Как-то дико сомнительно...
С помощью sizeof кстати тоже вариант. То есть если размер приводимого типа меньше приведенного то ошибка?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.10.2010, 18:42     Безопасное приведение #4
Цитата Сообщение от Lavroff Посмотреть сообщение
Nameless One, В 8-ой студии из нового стандарта? Как-то дико сомнительно...
Это было скромное предположение

Цитата Сообщение от Lavroff Посмотреть сообщение
С помощью sizeof кстати тоже вариант. То есть если размер приводимого типа меньше приведенного то ошибка?
Ну да. Это первое, что пришло в голову

Добавлено через 1 минуту
Цитата Сообщение от Lavroff Посмотреть сообщение
То есть если размер приводимого типа меньше приведенного то ошибка?
Если размер приведенного (T1) меньше приводимого (T), то тогда - ошибка
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.10.2010, 18:56  [ТС]     Безопасное приведение #5
Nameless One, А ведь ты был прав. Почти. CLR эт
safe_cast

Добавлено через 13 минут
Nameless One, Кстати про размер. Неплохо конечно, но насколько я понимаю преобразование:
C++
1
2
int t=5;
char f=static_cast<char>(t);
Не является опасным по своей сути. Разве нет? В таком случае по размеру не подходит
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.10.2010, 18:59     Безопасное приведение #6
А такое преобразование:
C++
1
2
int bigInteger = 123456;
char c = static_cast<char>(bigInteger);
char и int имеют разные размеры, а значит, и разные диапазоны возможных значений.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.10.2010, 19:00  [ТС]     Безопасное приведение #7
Nameless One, Это да. Абсолютно согласен. Это сужение.
При проверке по значению - это считается небезопасным, однако если в пределах цензуры - безопасным.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.10.2010, 19:04     Безопасное приведение #8
Хм... Приведи пример небезопасного приведения "в пределах цензуры"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2010, 19:09     Безопасное приведение
Еще ссылки по теме:

приведение класса - C++
Подскажите пожалуйста как грамотно сделать: Есть класс: class Base { virtual ~Base()=0; } И два наследника:

Приведение типов - C++
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a&gt;b){...}//Условие...

Приведение к void - C++
Доброй ночи! Просматривая код некоторой программы, обнаружил конструкцию следующего вида: void function(char a, char *p) { ...

Приведение типов - C++
В чем различие привидения типа (type)expression, от type(expression)?


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.10.2010, 19:09  [ТС]     Безопасное приведение #9
Nameless One, Хм. А ведь и правда. Лучше проверять по типам. Да, извини, ты прав.
Yandex
Объявления
27.10.2010, 19:09     Безопасное приведение
Ответ Создать тему
Опции темы

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