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

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

Восстановить пароль Регистрация
 
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.10.2010, 18:32     Безопасное приведение #1
Заинтересовало безопасное приведение типов. То есть чтобы определяло ужимание и выдавало ошибку.

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

И еще очень интересный вопрос - почему 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++
C++ Приведение типов
Приведение типов C++
Опишите безопасное ослабление правил для типов аргументов замещаемых функций C++
приведение класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.10.2010, 18:35     Безопасное приведение #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Lavroff Посмотреть сообщение
То есть чтобы определяло ужимание и выдавало ошибку.
Сравнивать размер с помощью sizeof?

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

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

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

C++ Приведение типов
Динамическое приведение C++
Приведение типов C++

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

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

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