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

В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? - C++

Восстановить пароль Регистрация
 
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
21.08.2016, 19:22     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #1
В чем разница между Си'шным приведением типа:
C++
1
2
3
4
...
int x{5};
ifs.write( (char*)&x, sizeof(int) );
...
и унарной шаблонной функцией static_cast:
C++
1
2
3
4
...
int x{5};
ifs.write( static_cast<char*>(&x), sizeof(int) );
...
с учётом того, что во втором случае не работает код
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2016, 19:22     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast?
Посмотрите здесь:

C++ Разница между приведением типов
C++ В чем разница между push_back и push?
Разница между рекурсивной функцией и обычной C++
C++ В чем разница между виртуальной и чисто виртуальной функцией?
C++ Разница между перегрузкой операторов внешней или внутренней функцией
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GbaLog-
Не Эксперт C++
1428 / 614 / 172
Регистрация: 24.08.2014
Сообщений: 2,486
Записей в блоге: 1
Завершенные тесты: 2
21.08.2016, 19:38     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #2
Bretbas, reinterpret_cast<>() пробовали?
А в чем разница и что лучше можете прочесть на хабре.
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
21.08.2016, 20:18  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #3
GbaLog-, я в курсе, что reinterpret_cast<>() работает. Мне интересно, почему static_cast не работает
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,223
21.08.2016, 20:24     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #4
Bretbas, привести int* к char* для компилятора равносильно, что привести Student* к Kaktus*.

Подробно объяснил?
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
21.08.2016, 20:28  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #5
Понятно, я так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
21.08.2016, 20:34     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #6
Цитата Сообщение от Bretbas Посмотреть сообщение
почему static_cast не работает
Потому что static_cast преобразует только совместимые типы.
Если хочется обойтись static_cast'ами, то нужно предварительно преобразовать в void*:
C++
1
static_cast<char*>(static_cast<void*>(&x))
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
21.08.2016, 20:43  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #7
Спасибо)
hoggy
5031 / 2114 / 403
Регистрация: 15.11.2014
Сообщений: 4,799
Завершенные тесты: 1
22.08.2016, 10:11     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #8
Цитата Сообщение от Bretbas Посмотреть сообщение
так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
огааа.


static_cast - приведение типов времени компиляции.
при этом компилятор использует своё знание об этих типах,
что бы гарантировать корректность приведения.



reinterpret_cast - реинтерпретировать тип.
например у вас есть тип "кошка".
а вы говорите компилятору:
"это - не кошка, а собака".

реинтерпретировать можно только ссылкки или указатели.
Babysitter
 Аватар для Babysitter
78 / 103 / 34
Регистрация: 23.11.2015
Сообщений: 315
Завершенные тесты: 1
22.08.2016, 10:40     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #9
Что делает приведение типов в стиле С: пытается использовать static_cast, если не получается, использует reinterpret_cast. Далее, если нужно, использует const_cast.(с)

Добавлено через 13 минут
это кстати и есть официально одобренный способ побайтовой записи
чего бы то ни было в файл с помощью файловых потоков?

C++
1
2
3
struct X { /* .. */} x;
/* filling x */
fs.write( reinterpret_cast<char*>(&x), sizeof(X) );
выглядит уродливо
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
23.08.2016, 17:18  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #10
Babysitter, можно так:
C++
1
2
3
4
5
6
7
8
9
10
...
template<class T> char* toBytes( T& value )
{
void* address { &value };
return static_cast<char*>( address );
}
...
int x;
f.write( toBytes( x ), sizeof( x ) );
...
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
23.08.2016, 19:22     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #11
Цитата Сообщение от Bretbas Посмотреть сообщение
В чем разница между Си'шным приведением типа
Цитата Сообщение от Bretbas Посмотреть сообщение
и унарной шаблонной функцией static_cast
добавлю, что static_cast легче найти поиском и он бросается в глаза в отличие от. Следовательно легче находить баги связанные с приведением типов.
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
23.08.2016, 19:48  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #12
dimcoder, тогда добавлю, что это относится не только к static_cast, но и reinterpret_cast, dynamic_cast и const_cast. Они очевидно бросаются в глаза, чем Си'шное приведение
HelicopterK52
633 / 176 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
23.08.2016, 20:02     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #13
Bretbas, раз уж шаблон, то std::addressof(value), а не &value
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
23.08.2016, 20:16  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #14
HelicopterK52,
раз уж шаблон, то std::addressof(value), а не &value
Очередная std функция. И что она делает? Я плохо пока разбираюсь с новым стандартом((( объясните, раз на то пошло

Добавлено через 2 минуты
Точнее я понимаю примерно что она делает. Но почему она лучше чем обычный &
GbaLog-
Не Эксперт C++
1428 / 614 / 172
Регистрация: 24.08.2014
Сообщений: 2,486
Записей в блоге: 1
Завершенные тесты: 2
23.08.2016, 20:21     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #15
Цитата Сообщение от Bretbas Посмотреть сообщение
И что она делает?
http://en.cppreference.com/w/cpp/memory/addressof
Если пользоваться переводчиком Google'a, то: Получает фактический адрес объекта или функции ARG, даже в присутствии перегруженного оператора &.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2016, 20:40     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast?
Еще ссылки по теме:

Создание dll-файла с шаблонной функцией C++
C++ В чем разница между new и malloc()?
В чем разница между malloc и new? C++

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

Или воспользуйтесь поиском по форуму:
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 467
Завершенные тесты: 1
23.08.2016, 20:40  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #16
Спасибо
Yandex
Объявления
23.08.2016, 20:40     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast?
Ответ Создать тему
Опции темы

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