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

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

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

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

27.10.2010, 18:32. Просмотров 623. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2010, 18:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Безопасное приведение (C++):

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

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

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

Приведение к типу - C++
В чем разница? static_cast&lt;int&gt;(a); и (int)a

Приведение типов - C++
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a = (float)123.4

приведение типов - C++
Объясните, пожалуйста, почему возникает такая ошибка: error C2666: 'operator *' : 4 overloads have similar conversions ? Из-за того,...

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от Lavroff Посмотреть сообщение
То есть если размер приводимого типа меньше приведенного то ошибка?
Если размер приведенного (T1) меньше приводимого (T), то тогда - ошибка
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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);
Не является опасным по своей сути. Разве нет? В таком случае по размеру не подходит
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 18:59 #6
А такое преобразование:
C++
1
2
int bigInteger = 123456;
char c = static_cast<char>(bigInteger);
char и int имеют разные размеры, а значит, и разные диапазоны возможных значений.
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.10.2010, 19:00  [ТС] #7
Nameless One, Это да. Абсолютно согласен. Это сужение.
При проверке по значению - это считается небезопасным, однако если в пределах цензуры - безопасным.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 19:04 #8
Хм... Приведи пример небезопасного приведения "в пределах цензуры"
1
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
27.10.2010, 19:09  [ТС] #9
Nameless One, Хм. А ведь и правда. Лучше проверять по типам. Да, извини, ты прав.
0
27.10.2010, 19:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2010, 19:09
Привет! Вот еще темы с ответами:

Приведение типов - C++
При вводе с клавиатуры s = 11 и a = 1.1, получаем 9. Результат переменной d = 10, это правильно. В чём подвох? int main() { ...

Приведение типов - C++
Уважаемые программеры, ПОМОГИТЕ!!! Нужно (мне) реализовать шаблонную функцию для приведения типов. Пример: newType_cast&lt;T&gt;(“123”); ...

Приведение типов - C++
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; int c; }; class Parent2

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


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

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

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