Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562

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

27.10.2010, 18:32. Показов 2127. Ответов 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2010, 18:32
Ответы с готовыми решениями:

Безопасное приведение типа - const_cast
Проблемы с функцией strcpy_s. Ошибки: 1)функция не принимает 2 аргументов 2)отсутствуют экземпляры перегруженная функция...

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

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

8
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 18:35
Лучший ответ Сообщение было отмечено ForEveR как решение

Решение

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

Цитата Сообщение от Lavroff Посмотреть сообщение
И еще очень интересный вопрос - почему safe_cast - ключевое слово (как минимум в MSVS)?
Может опять что-нибудь из нового стандарта?
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.10.2010, 18:37  [ТС]
Nameless One, В 8-ой студии из нового стандарта? Как-то дико сомнительно...
С помощью sizeof кстати тоже вариант. То есть если размер приводимого типа меньше приведенного то ошибка?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 18:42
Цитата Сообщение от Lavroff Посмотреть сообщение
Nameless One, В 8-ой студии из нового стандарта? Как-то дико сомнительно...
Это было скромное предположение

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

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

Добавлено через 13 минут
Nameless One, Кстати про размер. Неплохо конечно, но насколько я понимаю преобразование:
C++
1
2
int t=5;
char f=static_cast<char>(t);
Не является опасным по своей сути. Разве нет? В таком случае по размеру не подходит
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 18:59
А такое преобразование:
C++
1
2
int bigInteger = 123456;
char c = static_cast<char>(bigInteger);
char и int имеют разные размеры, а значит, и разные диапазоны возможных значений.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.10.2010, 19:00  [ТС]
Nameless One, Это да. Абсолютно согласен. Это сужение.
При проверке по значению - это считается небезопасным, однако если в пределах цензуры - безопасным.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
27.10.2010, 19:04
Хм... Приведи пример небезопасного приведения "в пределах цензуры"
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.10.2010, 19:09  [ТС]
Nameless One, Хм. А ведь и правда. Лучше проверять по типам. Да, извини, ты прав.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2010, 19:09
Помогаю со студенческими работами здесь

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

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

Приведение типов
Уважаемые программеры, ПОМОГИТЕ!!! Нужно (мне) реализовать шаблонную функцию для приведения типов. Пример:...

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru