На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (56) « Первая ... 42 43 [44] 45 46 ...  55 56  ( Перейти к последнему сообщению )  
> D vs C++ , почти сурковская пропаганда: не пора ли C++ потихоньку готовиться к пенсии?
    Цитата applegame @
    не вижу оснований называть это исключением. Например shared_ptr иммитирует ссылочную семантику, но никто не называет его исключением.

    Так он и не исключение. Есть T, есть shared_ptr<T>.
      Цитата D_KEY @
      Есть T, есть shared_ptr<T>.
      Не только, T может сам по себе являться shared_ptr<U>. То есть сигнатура шаблона выглядит как будто она принимает значение, а на самом деле это может быть указатель или shared_ptr.
      Сообщение отредактировано: applegame -
        Цитата applegame @
        Цитата D_KEY @
        Есть T, есть shared_ptr<T>.
        Не только, T может сам по себе являться shared_ptr<U>.

        Верно.

        Цитата
        То есть сигнатура шаблона выглядит как будто она принимает значение, а на самом деле это может быть указатель или shared_ptr.

        Ну так они же тоже типы. Со своими значениями :)
          Цитата D_KEY @
          Ну так они же тоже типы. Со своими значениями
          Дык и дешный класс тоже тип, со своим значением. И это значение не сам объект (как вы наверное полагаете), а указатель на него.
          Еще раз, класс в D - это отдельный тип. Если я пишу обобщенный шаблон, я могу специализировать его для классов, также как в плюсах можно специализировать для указателей или shared_ptr.
          ExpandedWrap disabled
            void foo(T)(T x) if (is(T == class)) {
                ....
            }

          Может в Дельфях как-то иначе устроено и вы неверно понимаете как оно работает в
          D?
          Сообщение отредактировано: applegame -
            Цитата applegame @
            И это значение не сам объект (как вы наверное полагаете), а указатель на него.

            Какого типа указатель?
              Цитата D_KEY @
              Какого типа указатель?
              Название типа совпадает с названием класса, так как это все-таки не указатель. Разница во внешнем виде. Написано Foo, а на самом деле это нечто подобное Foo*. И это, как я уже говорил раньше, немного печалит мой перфекционизм. Но опять же, как я уже говорил, это скорее академический недостаток, чем практический. А многие, наоборот, считают его достоинством.
              Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов. но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было.
              Приведите пример когда ссылочная семантика классов в D может мешать. Я пытался сам такой пример придумать. Один из приколов, что такой вот классовый псевдоуказатель нельзя разыменовать. Но в случае полиморфных классов его никогда и не нужно разыменовывать, а в случае неполиморфных в D используются структуры. Немного странновастенько, но особо не мешает.
              Сообщение отредактировано: applegame -
                Цитата applegame @
                Название типа совпадает с названием класса, так как это все-таки не указатель. Разница во внешнем виде. Написано Foo, а на самом деле это нечто подобное Foo*

                :) Ну вот о том и речь.

                Цитата
                Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов.

                Не попытался, а привел.

                Цитата
                но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было.

                Так в C++ и не нужно клонирование. Для любого типа сработает копирующий конструктор/оператор=.

                Цитата
                Приведите пример когда ссылочная семантика классов в D может мешать.

                А что там в плане сравнения? Обычно в языках со смешанной семантикой это доставляет определенные неудобства.
                  Цитата applegame @
                  Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов. но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было.
                  Приведите пример когда ссылочная семантика классов в D может мешать.

                  Смотри. В C++ я могу написать такой метод:
                  ExpandedWrap disabled
                    template<typename T>
                    T MakeCopy(T val)
                    {
                        T result(val);
                     
                        return result;
                    }


                  Потом понять, что для смарт-указателей мне нужно глубокое копирование и написать специализацию:
                  template<typename T>
                  ExpandedWrap disabled
                    auto MakeCopy(std::shared_ptr<T> val)
                    {
                        if (!val)
                            return std::shared_ptr<T>();
                     
                        return std::make_shared<T>(*val);
                    }

                  А так же отдельную специализацию для std::unique_ptr. И всё будет работать для любых вариантов типа параметра. В D, я так понимаю, такой возможности нет.
                    В языках, где все построено на значениях, нужен отдельный generic-тип для значений, эм, местоположения объектов. С операцией, позволяющей достучаться до объекта, который лежит в том месте. В си это указатели. Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию).
                    ExpandedWrap disabled
                      ??? foo(int *x)
                      {
                          return *x;
                      }


                    В языках, где все ссылки, особых проблем нет. Разве что не очень понятно, как копировать объекты, поэтому просто вводят два вида копирования - обычное и "глубокое". Ну и еще занимаются оптимизацией для примитивных типов, которая хорошо ложится на концепцию ссылок только в том случае, если мы объявляем примитивные типы формально иммутабельными.

                    А вот в языках со смешанным подходом возникают неоднозначности. Как и что мы копируем, как и что мы сравниваем и т.д.

                    Но это все больше теория. На практике, как правило, это не слишком усложняет жизнь. А сложные шаблоны на какой-нибудь яве в любом случае не напишешь :D А в D, в случае необходимости, можно легко решить проблему и действительно можно считать, что MyClass является просто неким smart_ptr<MyClass__internal>.

                    Вот ссылки в C++ мне совсем не нравятся. Иногда даже думаю, не лучше ли бы было, если бы они не являлись самостоятельными типами, а были просто спецификаторами для параметров функции/возвращаемого значения. А для ссылок можно иметь отдельный generic-тип, что-то вроде указателей без адресной арифметики. Как с этим в D?

                    Добавлено
                    Цитата Flex Ferrum @
                    В D, я так понимаю, такой возможности нет.

                    Там выше applegame приводил пример специализации
                    ExpandedWrap disabled
                      void foo(T)(T x) if (is(T == class)) {
                          ....
                      }
                    Сообщение отредактировано: D_KEY -
                      Цитата Flex Ferrum @
                      А так же отдельную специализацию для std::unique_ptr. И всё будет работать для любых вариантов типа параметра. В D, я так понимаю, такой возможности нет.
                      Неправильно понимаешь. Все точно также, можно специализировать шаблон на классы, на указатели и на все остальное.
                      Цитата D_KEY @
                      Вот ссылки в C++ мне совсем не нравятся. Иногда даже думаю, не лучше ли бы было, если бы они не являлись самостоятельными типами, а были просто спецификаторами для параметров функции/возвращаемого значения.
                      Именно так сделано в D. Есть спецификатор ref указывающий, что значение передается по ссылке. Но тип "ссылка" отсутствует. В общем-то не велика беда, можно задействовать указатель, особенно если учесть, что в D указатели агрегатных типов автоматически разыменовываются при обращении к методам и полям. Но я все равно иногда скучаю по плюсовым ссылкам. Их можно с высокой степенью достоверности реализовать в виде структуры-обертки, но это все равно не то.
                      Сообщение отредактировано: applegame -
                        Цитата applegame @
                        Но я все равно иногда скучаю по плюсовым ссылкам.

                        Можешь пример какой-нибудь привести показательный?
                          Цитата D_KEY @
                          Можешь пример какой-нибудь привести показательный?
                          Вряд ли, не помню когда это было. А в последнее время как-то не возникало необходимости в ссылках. У ссылки в плюсах есть серьезное отличие от указателя: ссылка требует обязательной инициализации, то бишь без специальных ухищрений ссылка не может ссылаться на несуществующий объект (уничтожение объекта после создания ссылки не учитываем), а вот указатель может указывать на null или вообще в случайное место.

                          Добавлено
                          Цитата D_KEY @
                          А для ссылок можно иметь отдельный generic-тип, что-то вроде указателей без адресной арифметики. Как с этим в D?
                          Вопроса не понял. Поясни.
                          Сообщение отредактировано: applegame -
                            Цитата D_KEY @
                            Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию).
                            Как так-то?
                            ExpandedWrap disabled
                              int& foo(int *x)
                              Цитата Qraizer @
                              Цитата D_KEY @
                              Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию).
                              Как так-то?
                              ExpandedWrap disabled
                                int& foo(int *x)

                              Кстати да. Дешный вариант:
                              ExpandedWrap disabled
                                ref int foo(int *x)
                                Цитата Qraizer @
                                Цитата D_KEY @
                                Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию).
                                Как так-то?
                                ExpandedWrap disabled
                                  int& foo(int *x)

                                Я про Си :)

                                Добавлено
                                Ссылки в С++ это некий уход от семантики значений. Что является значением типа T&?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (56) « Первая ... 42 43 [44] 45 46 ...  55 56


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0767 ]   [ 16 queries used ]   [ Generated: 29.03.24, 07:07 GMT ]