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

      Добавлено
      Цитата Qraizer @
      Нет. Как уже сказал D_KEY, = скопирует указатель и будет прав.
      А clone() тогда зачем упомянул? То ли хотел сбить меня с толку, то ли решил мгновенно на другие рельсы перепрыгнуть.
      Цитата Qraizer @
      В случае смешанной семантики у меня нет иного выбора, кроме как ветвиться метакодом,
      Я тебя не понимаю. Зачем ветвиться? Просто делай присваивание, скопируется обычный указатель или указатель на класс или значение. Никаких ветвлений.
      Сообщение отредактировано: applegame -
        Цитата applegame @
        Тоже самое в D. Для более легкого понимания, представь, что класс в D - это просто особый тип указателя, например shared_ptr.

        Представить я могу все, что угодно. Но в системе типов D для классов сделано исключение :)
          Цитата D_KEY @
          Но в системе типов D для классов сделано исключение
          Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением. ;)

          Единственная претензия, пожалуй, это то, что выглядит оно как передача по значению, а передается указатель.
          Сообщение отредактировано: applegame -
            Цитата applegame @
            скопируется обычный указатель или указатель на класс или значение.

            Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.
              Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же.

              applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией.
              Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать.
              Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти.
              Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет.

              В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная.

              В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия.
                Цитата applegame @
                Цитата D_KEY @
                Но в системе типов D для классов сделано исключение
                Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением. ;)

                Так они и не являются исключением. А класс в D является.
                  Цитата D_KEY @
                  В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа.
                  И чем же он будет отличаться? Будет создана копия значения этого типа, а именно типа класс такой-то.
                  Цитата D_KEY @
                  В частности, не будет иметь смысл T*
                  В D будет. Получится нечто похожее на плюсовой T**.
                    Цитата amk @
                    Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же.

                    applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией.
                    Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать.
                    Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти.
                    Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет.

                    В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная.

                    В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия.

                    Не то, чтобы я тут был за кого-то. Но в качестве примера, где мешает ссылочная семантика приведён пример говнокода :D
                    В данном сценарии я скорее за семантику, которая не одобряет такое поведение :)
                      Цитата amk @
                      Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же.
                      Ты издеваешься? Я тебе не Исмаил Прокопенко, я отлично разбираюсь и в указателях и ссылках и значениях. В D также существует передача по значению и по ссылке, правда самостоятельного типа "ссылка" не существует. Ты мне тут лекции по плюсам для детского сада не читай. У нас тут скорее философский диспут, а не спор о тонкостях работы типов.
                      Сообщение отредактировано: applegame -
                        Цитата D_KEY @
                        Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.

                        На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки.
                          Цитата KILLER @
                          Цитата D_KEY @
                          Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*.

                          На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки.

                          Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо.
                            Цитата D_KEY @
                            Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо.

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

                                Добавлено
                                Цитата D_KEY @
                                Так они и не являются исключением. А класс в D является.
                                не вижу оснований называть это исключением. Например shared_ptr иммитирует ссылочную семантику, но никто не называет его исключением.

                                Добавлено
                                Цитата negram @
                                Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько),
                                Интересно. Назови-ка мне независимый способ получения копии экземпляра объекта в плюсах. Скажем, я передал указатель и нужно создать копию объекта, на который этот указатель указывает.
                                Сообщение отредактировано: applegame -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (56) « Первая ... 41 42 [43] 44 45 ...  55 56


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