Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.252.8] |
|
Страницы: (15) 1 [2] 3 4 ... 14 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего?
|
Сообщ.
#17
,
|
|
|
Согласно описалову - никаких исключений: Цитата The definition of the macro assert depends on another macro, NDEBUG, which is not defined by the standard library. If NDEBUG is defined as a macro name at the point in the source code where <cassert> is included, then assert does nothing. If NDEBUG is not defined, then assert checks if its argument (which must have scalar type) compares equal to zero. If it does, assert outputs implementation-specific diagnostic information on the standard error output and calls std::abort. The diagnostic information is required to include the text of expression, as well as the values of the standard macros __FILE__, __LINE__, and the standard variable __func__. А std::abort, в свою очередь - noexcept. Да и вообще, если бы и было возможно - странный, мягко сказать механизм был бы. Исключениями возможно половить ситуации, которые возможно предусмотреть. На непредусмотренное (или неподлежащее исправлению) - выкинуть посмертно сообщение и выйти. Assert, имхо, именно для этого и заточен - сообщить о неведомом баге и выйти и программы. |
Сообщ.
#18
,
|
|
|
Цитата JoeUser @ Предлагаю следующую тему "множественное наследование vs примеси" Плюсы, минусы .... Раскрой тему, в чем ты тут видишь противостояние? Тем более, что в C++ примеси можно сделать только через наследование. |
Сообщ.
#19
,
|
|
|
Цитата D_KEY @ Раскрой тему, в чем ты тут видишь противостояние? Да как-то недавно Oraizer упомянул, мол (недословно) "в Цэ++ уже давно есть множественное наследование, а в таких языках как Джава и .NET их нет, и Цэ++ молодец, да!" Ну а я вот почитываю описание языка D - там похоже все нужное от множественного наследования решается примесями, полностью. Пока возникает вопрос: а нужно ли вообще множественное наследование (тому же D), если реализовали полноценные примеси? |
Сообщ.
#20
,
|
|
|
Цитата JoeUser @ Пока возникает вопрос: а нужно ли вообще множественное наследование (тому же D), если реализовали полноценные примеси? А зачем нужны примеси, если есть множественное наследование? Зачем плодить сущности? |
Сообщ.
#21
,
|
|
|
Цитата D_KEY @ А зачем нужны примеси, если есть множественное наследование? Зачем плодить сущности? Еще толком не разобрался, но беглое чтение пока убеждает - что примеси более гибки. Надо попробовать сравнить примеры-реализации. Пока только впечатление. |
Сообщ.
#22
,
|
|
|
Почитал повнимательнее - даж и не знаю как сравнивать. Не совсем сравниваемое получается. Описание из книги Александреску:
Цитата Короче говоря, выражение mixin позволяет вам превратить строку в исполняемый код. Синтаксис выражения выглядит как mixin(выражение), где выражение должно быть строкой, известной во время компиляции. Это ограничение исключает возможность динамически создавать программный код, например читать строку с терминала и интерпретировать ее. Нет, D - не интерпретируемый язык, и его компилятор не является частью средств стандартной библиотеки времени исполнения. Хорошие новости заключаются в том, что D на самом деле запускает полноценный интерпретатор во врем я компиляции, а значит, вы можете собирать строки настолько изощренными способами, насколько этого требуют условия вашей задачи. На примерах: Подмешивание виртуальной функции в класс mixin template Foo() { void func() { writeln("Foo.func()"); } } class Bar { mixin Foo; } class Code : Bar { override void func() { writeln("Code.func()"); } } void test() { Bar b = new Bar(); b.func(); // calls Foo.func() b = new Code(); b.func(); // calls Code.func() } А тут генерация перегрузок операторов + - ^ ++ -- с помощю предварительной интерпретации кода перед компиляцией: struct CheckedInt(N) if (isIntegral!N) { private N value; this(N value) { this.value = value; } CheckedInt opUnary(string op)() if (op == "+" || op == "-" || op == "^") { return CheckedInt(mixin(op ^ "value")); } ref CheckedInt opUnary(string op)() if (op == "++" || op == "--" ) { enum limit = op == "++" ? N.max : N.min; enforce(value != limit); mixin(op ^ "value;"); return this; } } Как можно для одного оператора "==" такое похожее сделать в Цэ++ template <typename T> struct AddNoEq { virtual bool operator==(const T &cmp) const = 0; bool operator!=(const T &cmp) const { return !static_cast<const T*>(this)->operator== (cmp); } }; Непривычная хрень - примеси, но впечатляет. Надо разбираться. |
Сообщ.
#23
,
|
|
|
Цитата D_KEY @ Зачем, если уже есть особый вид "исключений" - assert. Если ты опасаешься, что не все еще отлажено, можешь не убирать ассерты в релизе. applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего? Добавлено Цитата JoeUser @ Именно так.Почитал повнимательнее - даж и не знаю как сравнивать. Не совсем сравниваемое получается. Примеси и наследование пересекаются кое-где, но это разные сущности. Подмешивание примеси A в класс B добавляет функциональности, но не добавляет полиморфизма: класс B не стал класом A. Зачастую множественное наследование можно заменить примесями, но таки это не одно и тоже. Не забываем также, что в D разрешено множественное наследование интерфейсов. Что касается цитаты Александреску, то там описаны строковые миксины. Есть еще обычные миксины: mixin template Foo(T) { void test(T)(T arg) {} } class Bar { mixin Foo!int; // все что было описано внутри Foo будет здесь, но контекст остается местный } ... Bar bar = new Bar; bar.test(10); Но это выходит за рамки холивора, в C++ нет примесей, ни строковых ни обычных. |
Сообщ.
#24
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Зачем, если уже есть особый вид "исключений" - assert. Если ты опасаешься, что не все еще отлажено, можешь не убирать ассерты в релизе.applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего? assert - это не вид исключений, а отдельный механизм. |
Сообщ.
#25
,
|
|
|
Цитата JoeUser @ Я строковые миксины не очень люблю. Они крайне мощные, но трудночитаемы. В некоторых случаях они позволяют фокусы вроде автоматической генерации необходимого кода, что совместно со статической рефлексией превращается в весьма мощный инструмент. Непривычная хрень - примеси, но впечатляет. Надо разбираться. Добавлено Цитата D_KEY @ Чо, правда??? Ты кавычки вокруг слова "исключение", нарочно не заметил? assert - это не вид исключений, а отдельный механизм. оффтоп о D В D ассерты - это особый вид исключений, настоящих исключений, можно поймать c помощью catch если нужно. |
Сообщ.
#26
,
|
|
|
Цитата applegame @ Но это выходит за рамки холивора, в C++ нет примесей, ни строковых ни обычных. Совсем не выходит! Мы же говорим о языках, об способах, возможностях, а не х3 о чем. Это как раз таки, имхо, нормальная тематика. Все ровно. Добавлено Цитата applegame @ но не добавляет полиморфизма Ты хотел сказать "инкапсуляции"? Перегрузка виртуальных функций как-раз таки добавляет полиморфизм. |
Сообщ.
#27
,
|
|
|
Цитата JoeUser @ Для разговоров о D и сравнения с С++ уже есть холивор - D vs C++ Надо признать, местами D меня выбешивает, в нем полно всяких неочевидных и раздражающих моментов. Я даже одно время порывался пару раз бросить D и вернуться на корявенькие, но очень хорошо формализованые и хорошо вылизанные (в отличие от D) плюсы. Но меня сразу начинало тошнить от ужасного синтаксиса шаблонов и общей слабости метапрограммирования в плюсах. Потом я успокаивался, багу исправляли в следующем релизе, и все становилось на свои места. Совсем не выходит! Мы же говорим о языках, об способах, возможностях, а не х3 о чем. Это как раз таки, имхо, нормальная тематика. Все ровно. |
Сообщ.
#28
,
|
|
|
applegame, а при чем тут D?
|
Сообщ.
#29
,
|
|
|
Цитата applegame @ D vs C++ Ясн. Не видел. |
Сообщ.
#30
,
|
|
|
Цитата D_KEY @ Ты издеваешься, да? Кавычки опять проигнорил, зато спросил при чем тут нечто, обернутое в спойлер и помеченое, как оффтоп. Иди потролль в другом месте. applegame, а при чем тут D? |