На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (15) 1 [2] 3 4 ...  14 15 все  ( Перейти к последнему сообщению )  
> Легальный около Цэ++ шный холивар
    applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего? ;)
      Цитата amk @
      Да тем же catch'ем.

      Согласно описалову - никаких исключений:
      Цитата
      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, имхо, именно для этого и заточен - сообщить о неведомом баге и выйти и программы.
        Цитата JoeUser @
        Предлагаю следующую тему "множественное наследование vs примеси" ;)
        Плюсы, минусы ....

        Раскрой тему, в чем ты тут видишь противостояние? Тем более, что в C++ примеси можно сделать только через наследование.
          Цитата D_KEY @
          Раскрой тему, в чем ты тут видишь противостояние?

          Да как-то недавно Oraizer упомянул, мол (недословно) "в Цэ++ уже давно есть множественное наследование, а в таких языках как Джава и .NET их нет, и Цэ++ молодец, да!" :D Ну а я вот почитываю описание языка D - там похоже все нужное от множественного наследования решается примесями, полностью.

          Пока возникает вопрос: а нужно ли вообще множественное наследование (тому же D), если реализовали полноценные примеси?
            Цитата JoeUser @
            Пока возникает вопрос: а нужно ли вообще множественное наследование (тому же D), если реализовали полноценные примеси?

            А зачем нужны примеси, если есть множественное наследование? Зачем плодить сущности?
              Цитата D_KEY @
              А зачем нужны примеси, если есть множественное наследование? Зачем плодить сущности?

              Еще толком не разобрался, но беглое чтение пока убеждает - что примеси более гибки. Надо попробовать сравнить примеры-реализации. Пока только впечатление.
                Почитал повнимательнее - даж и не знаю как сравнивать. Не совсем сравниваемое получается. Описание из книги Александреску:

                Цитата
                Короче говоря, выражение mixin позволяет вам превратить строку в исполняемый код. Синтаксис выражения выглядит как mixin(выражение), где выражение должно быть строкой, известной во время компиляции. Это ограничение исключает возможность динамически создавать программный код, например читать строку с терминала и интерпретировать ее. Нет, D - не интерпретируемый язык, и его компилятор не является частью средств стандартной библиотеки времени исполнения. Хорошие новости заключаются в том, что D на самом деле запускает полноценный интерпретатор во врем я компиляции, а значит, вы можете собирать строки настолько изощренными способами, насколько этого требуют условия вашей задачи.


                На примерах:

                Подмешивание виртуальной функции в класс

                ExpandedWrap disabled
                  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()
                  }


                А тут генерация перегрузок операторов + - ^ ++ -- с помощю предварительной интерпретации кода перед компиляцией:

                ExpandedWrap disabled
                  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;
                    }
                  }


                Как можно для одного оператора "==" такое похожее сделать в Цэ++

                ExpandedWrap disabled
                  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);
                      }
                   };


                Непривычная хрень - примеси, но впечатляет. Надо разбираться.
                Сообщение отредактировано: JoeUser -
                  Цитата D_KEY @
                  applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего? ;)
                  Зачем, если уже есть особый вид "исключений" - assert. Если ты опасаешься, что не все еще отлажено, можешь не убирать ассерты в релизе.

                  Добавлено
                  Цитата JoeUser @
                  Почитал повнимательнее - даж и не знаю как сравнивать. Не совсем сравниваемое получается.
                  Именно так.
                  Примеси и наследование пересекаются кое-где, но это разные сущности. Подмешивание примеси A в класс B добавляет функциональности, но не добавляет полиморфизма: класс B не стал класом A.
                  Зачастую множественное наследование можно заменить примесями, но таки это не одно и тоже. Не забываем также, что в D разрешено множественное наследование интерфейсов.

                  Что касается цитаты Александреску, то там описаны строковые миксины. Есть еще обычные миксины:

                  ExpandedWrap disabled
                    mixin template Foo(T) {
                        void test(T)(T arg) {}
                    }
                     
                    class Bar {
                      mixin Foo!int; // все что было описано внутри Foo будет здесь, но контекст остается местный
                    }
                    ...
                    Bar bar = new Bar;
                    bar.test(10);


                  Но это выходит за рамки холивора, в C++ нет примесей, ни строковых ни обычных.
                  Сообщение отредактировано: applegame -
                    Цитата applegame @
                    Цитата D_KEY @
                    applegame, заведи особый вид исключений и все... Кстати, никогда не ловил в релизе баги, которые происходили потому, что там раньше был assert, а теперь просто ничего? ;)
                    Зачем, если уже есть особый вид "исключений" - assert. Если ты опасаешься, что не все еще отлажено, можешь не убирать ассерты в релизе.

                    assert - это не вид исключений, а отдельный механизм.
                      Цитата JoeUser @
                      Непривычная хрень - примеси, но впечатляет. Надо разбираться.
                      Я строковые миксины не очень люблю. Они крайне мощные, но трудночитаемы. В некоторых случаях они позволяют фокусы вроде автоматической генерации необходимого кода, что совместно со статической рефлексией превращается в весьма мощный инструмент.

                      Добавлено
                      Цитата D_KEY @
                      assert - это не вид исключений, а отдельный механизм.
                      Чо, правда??? Ты кавычки вокруг слова "исключение", нарочно не заметил? :D
                      оффтоп о D
                      В D ассерты - это особый вид исключений, настоящих исключений, можно поймать c помощью catch если нужно.
                        Цитата applegame @
                        Но это выходит за рамки холивора, в C++ нет примесей, ни строковых ни обычных.

                        Совсем не выходит! Мы же говорим о языках, об способах, возможностях, а не х3 о чем. Это как раз таки, имхо, нормальная тематика. Все ровно.

                        Добавлено
                        Цитата applegame @
                        но не добавляет полиморфизма

                        Ты хотел сказать "инкапсуляции"? Перегрузка виртуальных функций как-раз таки добавляет полиморфизм.
                          Цитата JoeUser @
                          Совсем не выходит! Мы же говорим о языках, об способах, возможностях, а не х3 о чем. Это как раз таки, имхо, нормальная тематика. Все ровно.
                          Для разговоров о D и сравнения с С++ уже есть холивор - D vs C++ Надо признать, местами D меня выбешивает, в нем полно всяких неочевидных и раздражающих моментов. Я даже одно время порывался пару раз бросить D и вернуться на корявенькие, но очень хорошо формализованые и хорошо вылизанные (в отличие от D) плюсы. Но меня сразу начинало тошнить от ужасного синтаксиса шаблонов и общей слабости метапрограммирования в плюсах. Потом я успокаивался, багу исправляли в следующем релизе, и все становилось на свои места.
                          Сообщение отредактировано: applegame -
                            applegame, а при чем тут D?
                              Цитата applegame @
                              D vs C++

                              Ясн. Не видел.
                                Цитата D_KEY @
                                applegame, а при чем тут D?
                                Ты издеваешься, да? Кавычки опять проигнорил, зато спросил при чем тут нечто, обернутое в спойлер и помеченое, как оффтоп. Иди потролль в другом месте. :P
                                Сообщение отредактировано: applegame -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (15) 1 [2] 3 4 ...  14 15 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0623 ]   [ 16 queries used ]   [ Generated: 19.04.24, 03:59 GMT ]