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

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

Войти
Регистрация
Восстановить пароль
 
Bretbas
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
#1

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

21.08.2016, 19:22. Просмотров 312. Ответов 15
Метки нет (Все метки)

В чем разница между Си'шным приведением типа:
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++
Всем пт! Поясните плз разницу между приведениями типов: double (a); (double) a; static_cast &lt;double&gt; (a);

В чем разница между виртуальной и чисто виртуальной функцией? - C++
в чем разница между виртуальной и чисто виртуальной функцией? virtual void print(){..} virtual void ex(..)=0;

Разница между рекурсивной функцией и обычной - C++
Как можно посчитать разницу между рекурсивной функцией и обычной? Там как то можно время работы функций высчитывать, как это сделать? Какие...

Разница между перегрузкой операторов внешней или внутренней функцией - C++
Перегружаю operator* (умножаю экземпляры своего класса между собой). Как лучше перегрузить: MyClass operator*(MyClass a, MyClass b){}или ...

В чем разница между random и randomize? - C++
в чем разница между random и randomize??

В чем разница между инициализацией и присваиванием? - C++
в чем разница между инициализацией и присваиванием? практически это одно и тоже,кроме инициализации ссылок-они могут менять значение.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GbaLog-
Любитель чаепитий
2589 / 1128 / 281
Регистрация: 24.08.2014
Сообщений: 4,131
Записей в блоге: 1
Завершенные тесты: 2
21.08.2016, 19:38     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #2
Bretbas, reinterpret_cast<>() пробовали?
А в чем разница и что лучше можете прочесть на хабре.
Bretbas
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
21.08.2016, 20:18  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #3
GbaLog-, я в курсе, что reinterpret_cast<>() работает. Мне интересно, почему static_cast не работает
rikimaru2013
C++ Game Dev
2405 / 1099 / 238
Регистрация: 30.11.2013
Сообщений: 3,623
21.08.2016, 20:24     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #4
Bretbas, привести int* к char* для компилятора равносильно, что привести Student* к Kaktus*.

Подробно объяснил?
Bretbas
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
21.08.2016, 20:28  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #5
Понятно, я так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
21.08.2016, 20:43  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #7
Спасибо)
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1
22.08.2016, 10:11     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #8
Цитата Сообщение от Bretbas Посмотреть сообщение
так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
огааа.


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



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

реинтерпретировать можно только ссылкки или указатели.
Babysitter
80 / 107 / 35
Регистрация: 23.11.2015
Сообщений: 331
Завершенные тесты: 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
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 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
Полярный
455 / 428 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
23.08.2016, 19:22     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #11
Цитата Сообщение от Bretbas Посмотреть сообщение
В чем разница между Си'шным приведением типа
Цитата Сообщение от Bretbas Посмотреть сообщение
и унарной шаблонной функцией static_cast
добавлю, что static_cast легче найти поиском и он бросается в глаза в отличие от. Следовательно легче находить баги связанные с приведением типов.
Bretbas
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
23.08.2016, 19:48  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #12
dimcoder, тогда добавлю, что это относится не только к static_cast, но и reinterpret_cast, dynamic_cast и const_cast. Они очевидно бросаются в глаза, чем Си'шное приведение
HelicopterK52
658 / 201 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
23.08.2016, 20:02     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #13
Bretbas, раз уж шаблон, то std::addressof(value), а не &value
Bretbas
188 / 47 / 7
Регистрация: 05.08.2013
Сообщений: 742
Завершенные тесты: 1
23.08.2016, 20:16  [ТС]     В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? #14
HelicopterK52,
раз уж шаблон, то std::addressof(value), а не &value
Очередная std функция. И что она делает? Я плохо пока разбираюсь с новым стандартом((( объясните, раз на то пошло

Добавлено через 2 минуты
Точнее я понимаю примерно что она делает. Но почему она лучше чем обычный &
GbaLog-
Любитель чаепитий
2589 / 1128 / 281
Регистрация: 24.08.2014
Сообщений: 4,131
Записей в блоге: 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?
Еще ссылки по теме:

В чем разница между Рекурсией и Итерацией? - C++
Рекурсия позволяет сэкономить время но требует больше памяти, а циклы длятся дольше рекурсии но при этом занимают меньше памяти? Я...

В чем разница между const и constexpr? - C++
Когда стоит применять constexpr? В чём его отличие от const? Если можно конкретные примеры в их различиях. Например, constexpr int m =...

В чем разница между Double и Float? - C++
Хмм? :(

В чем разница между f.read(),f.write() и f<<., f>>.? - C++
В чем разница между f.read(),f.write() и f&lt;&lt;..., f&gt;&gt;...?


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

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

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