Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.240.21] |
|
Страницы: (56) « Первая ... 42 43 [44] 45 46 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#646
,
|
|
|
Цитата applegame @ не вижу оснований называть это исключением. Например shared_ptr иммитирует ссылочную семантику, но никто не называет его исключением. Так он и не исключение. Есть T, есть shared_ptr<T>. |
Сообщ.
#647
,
|
|
|
Цитата D_KEY @ Не только, T может сам по себе являться shared_ptr<U>. То есть сигнатура шаблона выглядит как будто она принимает значение, а на самом деле это может быть указатель или shared_ptr. Есть T, есть shared_ptr<T>. |
Сообщ.
#648
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Не только, T может сам по себе являться shared_ptr<U>.Есть T, есть shared_ptr<T>. Верно. Цитата То есть сигнатура шаблона выглядит как будто она принимает значение, а на самом деле это может быть указатель или shared_ptr. Ну так они же тоже типы. Со своими значениями |
Сообщ.
#649
,
|
|
|
Цитата D_KEY @ Дык и дешный класс тоже тип, со своим значением. И это значение не сам объект (как вы наверное полагаете), а указатель на него.Ну так они же тоже типы. Со своими значениями Еще раз, класс в D - это отдельный тип. Если я пишу обобщенный шаблон, я могу специализировать его для классов, также как в плюсах можно специализировать для указателей или shared_ptr. void foo(T)(T x) if (is(T == class)) { .... } Может в Дельфях как-то иначе устроено и вы неверно понимаете как оно работает в D? |
Сообщ.
#650
,
|
|
|
Цитата applegame @ И это значение не сам объект (как вы наверное полагаете), а указатель на него. Какого типа указатель? |
Сообщ.
#651
,
|
|
|
Цитата D_KEY @ Название типа совпадает с названием класса, так как это все-таки не указатель. Разница во внешнем виде. Написано Foo, а на самом деле это нечто подобное Foo*. И это, как я уже говорил раньше, немного печалит мой перфекционизм. Но опять же, как я уже говорил, это скорее академический недостаток, чем практический. А многие, наоборот, считают его достоинством.Какого типа указатель? Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов. но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было. Приведите пример когда ссылочная семантика классов в D может мешать. Я пытался сам такой пример придумать. Один из приколов, что такой вот классовый псевдоуказатель нельзя разыменовать. Но в случае полиморфных классов его никогда и не нужно разыменовывать, а в случае неполиморфных в D используются структуры. Немного странновастенько, но особо не мешает. |
Сообщ.
#652
,
|
|
|
Цитата applegame @ Название типа совпадает с названием класса, так как это все-таки не указатель. Разница во внешнем виде. Написано Foo, а на самом деле это нечто подобное Foo* Ну вот о том и речь. Цитата Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов. Не попытался, а привел. Цитата но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было. Так в C++ и не нужно клонирование. Для любого типа сработает копирующий конструктор/оператор=. Цитата Приведите пример когда ссылочная семантика классов в D может мешать. А что там в плане сравнения? Обычно в языках со смешанной семантикой это доставляет определенные неудобства. |
Сообщ.
#653
,
|
|
|
Цитата applegame @ Qraizer попытался привести пример случая, когда это начинает мешать, что-то там с клонированием объектов. но потом и ты и он дружно перевели стрелки и сделали вид, что никакого клонирования не было. Приведите пример когда ссылочная семантика классов в D может мешать. Смотри. В C++ я могу написать такой метод: template<typename T> T MakeCopy(T val) { T result(val); return result; } Потом понять, что для смарт-указателей мне нужно глубокое копирование и написать специализацию: template<typename T> auto MakeCopy(std::shared_ptr<T> val) { if (!val) return std::shared_ptr<T>(); return std::make_shared<T>(*val); } А так же отдельную специализацию для std::unique_ptr. И всё будет работать для любых вариантов типа параметра. В D, я так понимаю, такой возможности нет. |
Сообщ.
#654
,
|
|
|
В языках, где все построено на значениях, нужен отдельный generic-тип для значений, эм, местоположения объектов. С операцией, позволяющей достучаться до объекта, который лежит в том месте. В си это указатели. Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию).
??? foo(int *x) { return *x; } В языках, где все ссылки, особых проблем нет. Разве что не очень понятно, как копировать объекты, поэтому просто вводят два вида копирования - обычное и "глубокое". Ну и еще занимаются оптимизацией для примитивных типов, которая хорошо ложится на концепцию ссылок только в том случае, если мы объявляем примитивные типы формально иммутабельными. А вот в языках со смешанным подходом возникают неоднозначности. Как и что мы копируем, как и что мы сравниваем и т.д. Но это все больше теория. На практике, как правило, это не слишком усложняет жизнь. А сложные шаблоны на какой-нибудь яве в любом случае не напишешь А в D, в случае необходимости, можно легко решить проблему и действительно можно считать, что MyClass является просто неким smart_ptr<MyClass__internal>. Вот ссылки в C++ мне совсем не нравятся. Иногда даже думаю, не лучше ли бы было, если бы они не являлись самостоятельными типами, а были просто спецификаторами для параметров функции/возвращаемого значения. А для ссылок можно иметь отдельный generic-тип, что-то вроде указателей без адресной арифметики. Как с этим в D? Добавлено Цитата Flex Ferrum @ В D, я так понимаю, такой возможности нет. Там выше applegame приводил пример специализации void foo(T)(T x) if (is(T == class)) { .... } |
Сообщ.
#655
,
|
|
|
Цитата Flex Ferrum @ Неправильно понимаешь. Все точно также, можно специализировать шаблон на классы, на указатели и на все остальное.А так же отдельную специализацию для std::unique_ptr. И всё будет работать для любых вариантов типа параметра. В D, я так понимаю, такой возможности нет. Цитата D_KEY @ Именно так сделано в D. Есть спецификатор ref указывающий, что значение передается по ссылке. Но тип "ссылка" отсутствует. В общем-то не велика беда, можно задействовать указатель, особенно если учесть, что в D указатели агрегатных типов автоматически разыменовываются при обращении к методам и полям. Но я все равно иногда скучаю по плюсовым ссылкам. Их можно с высокой степенью достоверности реализовать в виде структуры-обертки, но это все равно не то. Вот ссылки в C++ мне совсем не нравятся. Иногда даже думаю, не лучше ли бы было, если бы они не являлись самостоятельными типами, а были просто спецификаторами для параметров функции/возвращаемого значения. |
Сообщ.
#656
,
|
|
|
Цитата applegame @ Но я все равно иногда скучаю по плюсовым ссылкам. Можешь пример какой-нибудь привести показательный? |
Сообщ.
#657
,
|
|
|
Цитата D_KEY @ Вряд ли, не помню когда это было. А в последнее время как-то не возникало необходимости в ссылках. У ссылки в плюсах есть серьезное отличие от указателя: ссылка требует обязательной инициализации, то бишь без специальных ухищрений ссылка не может ссылаться на несуществующий объект (уничтожение объекта после создания ссылки не учитываем), а вот указатель может указывать на null или вообще в случайное место. Можешь пример какой-нибудь привести показательный? Добавлено Цитата D_KEY @ Вопроса не понял. Поясни. А для ссылок можно иметь отдельный generic-тип, что-то вроде указателей без адресной арифметики. Как с этим в D? |
Сообщ.
#658
,
|
|
|
Цитата D_KEY @ Как так-то?Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию). int& foo(int *x) |
Сообщ.
#659
,
|
|
|
Цитата Qraizer @ Цитата D_KEY @ Как так-то?Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию). int& foo(int *x) Кстати да. Дешный вариант: ref int foo(int *x) |
Сообщ.
#660
,
|
|
|
Цитата Qraizer @ Цитата D_KEY @ Как так-то?Единственным недостатком с точки зрения логики является то, что невозможно написать свою версию разыменования(или прокси-функцию). int& foo(int *x) Я про Си Добавлено Ссылки в С++ это некий уход от семантики значений. Что является значением типа T&? |