Всякий раз перед использованием функции, её необходимо пересматривать (для того, чтобы быть рациональным?)

Модератор: Модераторы разделов

v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение v04bvs »

drBatty писал(а):
08.12.2007 10:14
В С++ (языка ##c++ не знаю), перевод из типа в тип выглядит так:

Код: Выделить всё

x = y;//копирование с переводом
x(y);//инициализация с переводом
f(y);//вызов функции с параметром не того типа
(const my_type*)x;//это если явно захотелось;)

А как же staic_cast, const_cast, dynamic_cast, reinterpret_cast, boost::lexical_cast ? И вообще имхо C-приведение не рекомендовано. Не знаю почему правда :)
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение Uncle_Theodore »

А что такого негламурного в stringstream'е? По-моему, очень интуитивно понятный вариант.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение deninok »

(v04bvs) писал(а):А как же staic_cast, const_cast, dynamic_cast, reinterpret_cast, boost::lexical_cast ? И вообще имхо C-приведение не рекомендовано. Не знаю почему правда :)

Приведение в стиле С не рекомендовано хотя бы потому, что его в исходном тексте гораздо труднее искать, нежели приведение в стиле С++. И потом в С была одна форма приведения на все случаи жизни, а в С++ приведения разбиты по группам, что логичнее и понятнее, на мой взгляд.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение v04bvs »

deninok писал(а):
11.12.2007 21:39
(v04bvs) писал(а):А как же staic_cast, const_cast, dynamic_cast, reinterpret_cast, boost::lexical_cast ? И вообще имхо C-приведение не рекомендовано. Не знаю почему правда :)

Приведение в стиле С не рекомендовано хотя бы потому, что его в исходном тексте гораздо труднее искать, нежели приведение в стиле С++. И потом в С была одна форма приведения на все случаи жизни, а в С++ приведения разбиты по группам, что логичнее и понятнее, на мой взгляд.


По-моему самым логичным и понятным является джавовский подход :) Но это конечно не zero-overhead, да :(
Аргумент про поиск в исходном тексте я знаю, но не принимаю. Зачем там что то искать? Может унарный минус тоже оформим как-нибудь вроде static_minus<double> :)
Я подумал - это хорошо подходит например потому что можно свои касты выдумать, и они будут органично сливаться с существующими, вроде my_cast<double>( static_cast<float>(x) ). Учитывая маниакальное пристрастие тов. Страуструпа перегружать всё и вся, это выглядит, имхо, правдоподобно.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение drBatty »

v04bvs писал(а):
11.12.2007 21:30
И вообще имхо C-приведение не рекомендовано. Не знаю почему правда :)
Тут уже писалось почему. У меня это просто пример, для совместимости с библиотеками С(например с int printf(const char *, ...)). ИМХО явное преобразование типов надо избегать, в т. ч. и плюсовые *_cast. А вот неявное очень удбно(имхо, конечно).


Uncle_Theodore писал(а):
11.12.2007 21:37
А что такого негламурного в stringstream'е? По-моему, очень интуитивно понятный вариант.
В данном конкретном случае, я тоже не понимаю, чем KukMan'а этот вариант не устроил...

v04bvs писал(а):
11.12.2007 23:48
Может унарный минус тоже оформим как-нибудь вроде static_minus<double> :)
может лучше my_type my_type::operator-() const; ? ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение deninok »

(v04bvs) писал(а):Аргумент про поиск в исходном тексте я знаю, но не принимаю. Зачем там что то искать? Может унарный минус тоже оформим как-нибудь вроде static_minus<double> :)

Брюс Эккель в своей книге "Философия С++" приводит такой пример. Представьте, что вам принесли неработающую (или работающую неправильно) программу на С++, в которой используется явное приведение типов в стиле С. Известно, что явное приведение типов может быть источником трудноуловимых ошибок (например, потеря данных). И вот вы решили искать в этой программе все места с явным приведением, чтобы их проверить. Вопрос: как их искать?
Выражение типа:

Код: Выделить всё

a = (b)c;
не очень-то бросается в глаза. Зато выражение:

Код: Выделить всё

a = static_cast<b>(c);
найти гораздо легче, в том числе и с использованием автопоиска в редакторе (по выражению "_cast", например).
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Всякий раз перед использованием функции, её необходимо пересматривать

Сообщение drBatty »

deninok писал(а):
12.12.2007 14:03
Известно, что явное приведение типов может быть источником трудноуловимых ошибок (например, потеря данных).
Приведите пример, пожалуйста. Если вы о
(class*)
(
(void*)
(class*)
)
то тут беда не в приведении, а в (void*), который можно найти поиском.
Во всех(возможно почти) остальных случаях преобразование типов может быть не явным, и его будет не видно.

Остаётся приведение указателя на базовый класс к указателю на не тот производный, но это уже совсем другая тема.

ЗЫЖ Просьба к модераторам: отрежьте пожалуйста обсуждение типов от обсуждения вложенных функций(где-то с #27).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: