Re[26]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 08.02.05 22:41
Оценка:
VladD2,

> MS>Возвращаясь к той же операции alpha-blend:

> MS>
> MS>template<class ValueT, class Order, int Shift> class pixel_formats_rgba
> MS>{
> MS>   enum { Shift2 = Shift * 2 };
> MS>   . . .
> MS>            do
> MS>            {
> MS>               p[Order::R] = (ValueT)((((c.r - r) * alpha) + (r << Shift2)) >> Shift2);
> MS>               p[Order::G] = (ValueT)((((c.g - g) * alpha) + (g << Shift2)) >> Shift2);
> MS>               p[Order::B] = (ValueT)((((c.b - b) * alpha) + (b << Shift2)) >> Shift2);
> MS>               p[Order::A] = (ValueT)(((alpha + (a << Shift)) - ((alpha * Shift) >> 8)) >> 8);
> MS>               p += 4;
> MS>            }
> MS>            while(--len);
> MS>   . . .
> MS>};
> MS>

>
> Вот это уже пример метапрограммирования.

Это по какому определению? По общепринятому — самое обычное обобщенное программирование, т.к. можно скопипэйстить для каждого из использующихся типов и значений Shift в неизменном виде. Т.е. классический параметрический полиморфизм.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[19]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 08.02.05 22:51
Оценка:
VladD2,

> ПК> Нужно ехать: нужно, чтобы клиент не копипэйстил x + y в своем коде, а это было сделано один раз в шаблоне.


> Ну, себя ты уже явно убедил. Столь ужасный копипэст действительно является серьезным основанием чтобы возиться с полумакросными технолгиями, пялиться в найрен не нужные навороты и читать трехметровые сообщения об ошибках.


Это ж только пример. При попытке использования generics, например, для написания обобщенных матриц и векторов (в смысле линейной алгебры) ушьешься передавать туда делегаты. Будет самый настоящий copy-paste на стороне клиента.

Я все еще жду примера, где generics дают что-нибудь новое по сравнению с обычным классом, если закрыть глаза на приведение типов.

> А где "x + y"? Ты код то прочел? Ну, давай с коментариями, чтобы для танкистов:

>
> // Процедура универсального получения делегата метода сложения.
> // Если у типа реализован оператор сложения, то он обязательно
> // содержит статический метод op_Addition.
> // Таким образом мы создаем делегат для этого метода/типа.
> static Adder<T> GetAdditionOperator<T>()
> {
>         return (Adder<T>)Delegate.CreateDelegate(
>                 typeof(Adder<T>), typeof(T), "op_Addition");
> }
> ...
>

> Так яснее?

Да, так яснее. Это же можно сделать и без generics. Они здесь ничего нового по сравнению с обычными классами не дают.

> ПК>Это означает, что клиенты моего "generic" класса будут в своем коде делать copy-paste для каждого нового типа, с которым они мой "generic" класс захотят использовать. Или, если "по месту", то не для каждого типа, а в месте каждого вызова.

>
> Это означет, что тебе болше придумать нечего. А ничего что ты операторы постоянно копипэстиш? Не думл на счет написания шаблона заменяющего их?

Уже написано. <boost/operators.hpp>

> Не неси откровенню чушь.


Чего и вам желаю.

> А на шаблонах без метапрограммирование такое возможно? Что до демагогии спускаться то? Обобщенное программирование и подразумевает статически типизированное программировние на бзе абстрактных типов.


О, уже ближе. Теперь вернемся к примеру выше, и ответим на вопрос: является ли конструкция ниже примером "статически типизированного программирования":
>         return (Adder<T>)Delegate.CreateDelegate(
>                 typeof(Adder<T>), typeof(T), "op_Addition");
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 08.02.05 22:58
Оценка: 3 (1)
VladD2,

> ПК>Да, естественно. Опосредованно шаблоны можно тоже из DLL экспортировать.

>
> Да ну? А можно пример посмотреть?

На уровне возможностей generics? Пишешь обычный класс + шаблон-обвязку, приводящую аргументы и результаты функций. Класс экспортируется, шаблон включается обычным #include. Все, справился.

> ПК>Пока так и не было продемонстрировано, что позволяют сделать generics, чего нельзя сделать обычным классом, если не принимать во внимание необходимость приведений типов во втором случае.


> Дык написать обобщенный алгоритм или контейнер.


В чем, кроме отсутствия необходимости в приведениях типов, проявляется его обобщенность в случае generics?

> Или ты о том, что и обобщенное программирование и динамический полиморфизм суть проявления полиморфизма и с филосовской точки зрения обладают равными возможностями?


Разными. Параметрический полиморфизм (aka основной инструмент обобщенного программирования) позволяет писать код идентичным образом для разных типов. Generics ограничивают множество конструкций до тех же, что доступны в "обычных", не generic, классах.

> В общем, это несерьезно. Очевидно, что дженерики — это полноценное средство обобщенного программирования. Примеров которые невозможно реализовать ты так и не привел. Признаваться что не прав тоже не хочешь.


Еще раз: конкретно, какие возможности доступны в generics, которые нельзя получить "обычными" классами, если не учитывать приведения типов?

> ПК>Ошибся. Подразумевалось: http://rsdn.ru/Forum/Message.aspx?mid=1016014&amp;only=1
Автор: Павел Кузнецов
Дата: 08.02.05

>
> И? Опять млкие ужимки.

Не хами.

> Я алгоритм реализовал? Он обобщенный? Что еще? Код на Камеа не компилируется?


"Алгоритм" в данном случае сводится x + y. Эту часть ты так в generics и не включил. Точнее, один вариант был, но основанный на "обычных", не generic средствах.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[20]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.05 23:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это ж только пример. При попытке использования generics, например, для написания обобщенных матриц и векторов (в смысле линейной алгебры) ушьешься передавать туда делегаты. Будет самый настоящий copy-paste на стороне клиента.


Не уешся. На каждый тип нужно ровно один делегат. И передавать его не нужно. Положи ссылку в поле и используй. А если методов много, то заведи дженерик-интерфейс с ними. Реализация такого чуда — это пара пальцев об асфальт. Студия 90% работы слелает... За-то все четко специфицировано и явно.

ПК>Я все еще жду примера, где generics дают что-нибудь новое по сравнению с обычным классом, если закрыть глаза на приведение типов.


Что нового можно найти после появления структурного программирования? Если я чего-то не понимаю, то держни... покажи класс. Сделай на шаблонах это новое, но без метапрограммирования, плиз.

ПК>Да, так яснее. Это же можно сделать и без generics. Они здесь ничего нового по сравнению с обычными классами не дают.


Не, ну если все типы в object-ах, и постоянный боксинг-анбоксинг, да языком Шарп или Васик, то конечно. Ну, и если память и скорость невозна. Пишут же люди на скриптах? Но тут кто-то расскзаывал о типобезопасности, производительности и т.п. Это не ты был?

Мы вообще о чем? Ты как-то забавно выкручивашся. Что ты понимашь под обобщенным программированием? И какою качественную разницу ты видишь между дженериками и шаблонами?

ПК>Уже написано. <boost/operators.hpp>


Значит операторы уже мовитон? Однако. А почем у вас огурцы? (с)

ПК>О, уже ближе.


К чему?

ПК> Теперь вернемся к примеру выше, и ответим на вопрос: является ли конструкция ниже примером "статически типизированного программирования":

ПК>
>>         return (Adder<T>)Delegate.CreateDelegate(
>>                 typeof(Adder<T>), typeof(T), "op_Addition");
ПК>

Нет. Но причем тут эта конструкция? Это автоматизация для особо линивых. Нужная один раз в жизни. Вот эти конструкции
Автор: VladD2
Дата: 08.02.05
являются. К дженерикам относятся именно оин.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 08.02.05 23:27
Оценка:
VladD2,

> ПК>Имеющим самое непосредственное: от определения того, что является метапрограммированием, а что нет, напрямую зависит верность изначального тезиса о том, что отличия generics C# от шаблонов C++ сводятся к поддержке метапрограммирования.


> Нет уж. Не имеющих. Ты утверждаешь: <...>


Ты потерял нить
Автор: AndrewVK
Дата: 10.01.05
:

исходная мысль была о том, что большинство отличий в возможностях шаблонов имеют практическое значение при метапрограммировании, а не при дженерик-программировании

К этому тезису определение того, что же такое метапрограммирование, имеет самое наинепосредственнейшее отношение.

> То что итераторы не имеют отношения к метапрограммированию никак не касается этих утверждений. Так что уципился ты за них только потму-что больше не за что. И выглядит это очень некрасиво.


Речь об итераторах зашла до того, как я в этой ветке дал ссылку на Брюса Эккеля. Не путай все в одну кучу.

> Я читаю внимательно. Упоминаний Шарпа в статье два. Оба в суе и бездоказательно.


Опровергни.

> ПК>

But in Java (and apparently C#), you can't seem to say "any type."

>
>

apparently нареч. <...> Как ты думашь, автор применил слово в первом или втором значении?

Абсолютно все равно, что означает "apparently". К C# все его рассуждения о Java применимы в полной степени со сделанными им оговорками о поддержке на уровне IL. В C# ты тоже, как и в Java, лимитирован интерфейсами. Подробнее см. в следующей статье, на которую, кстати, была ссылка из первой.

> ПК>[q]C# also doesn't support latent typing, and although it has a better generics model than Java (since they went ahead and changed the underlying IL so that, for example, a static field in a class will be different between class and class). So if you want latent typing you'll have to use C++ or D (or Python, Smalltalk, Ruby, etc.).

>
> И что ты тут усмотрел? То что в Шарпе дженерики лучше?

Я выделил.

> наблюдается явная тенденция к тому, что некоторые привыкшие к одному подходу воспринимают в штыки все новое и даже не пытаются вникнуть и оценить. Товаришь явно несет чушь.


Или же ты не можешь/не хочешь понять, о чем идет речь.

> ПК>В результате своих экспериментов я и пришел к более-менее тем же выводам, что и Брюс Эккель.


> Странно. А код получился хотя и кривой, но более мнее обобщенный.


Скорее менее, из-за мест, где приходится делать copy-paste.

> В общем, твои ужимки <...>


Помнишь фильм "Кукушка"? Я скоро буду вынужден обращаться к тебе так же, как к главному герою того фильма, если ты не прекратишь хамить.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.05 23:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Это по какому определению? По общепринятому — самое обычное обобщенное программирование, т.к. можно скопипэйстить для каждого из использующихся типов и значений Shift в неизменном виде. Т.е. классический параметрический полиморфизм.


Нет, батенька. Тут и параметризация константами, и изменение структуры кода при изменении параметра типа. Натуральная кодогенерация. И потому легко решается с помощью макросов и кодогенераторов.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.05 23:37
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>На уровне возможностей generics? Пишешь обычный класс + шаблон-обвязку, приводящую аргументы и результаты функций. Класс экспортируется, шаблон включается обычным #include. Все, справился.


Ну, тоесть нельзя? Шаблон инклюдами... дальше уже можно не продолжать. Если хоть один метод с параметром типа скомпилирован, то новых специализаций уже не породить.

ПК>В чем, кроме отсутствия необходимости в приведениях типов, проявляется его обобщенность в случае generics?


В отсуствии необходимости применения боксинга, наследования, виртуальных методов. В применимости к вэлью-типам. В общем, во всем в том, что касается и шаблонов. В итоге статическая типобезопастность и повешение скорости.

А можно узнать что нового привносят в данном разрезе шаблоны?

ПК>Разными. Параметрический полиморфизм (aka основной инструмент обобщенного программирования) позволяет писать код идентичным образом для разных типов. Generics ограничивают множество конструкций до тех же, что доступны в "обычных", не generic, классах.


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

ПК>Еще раз: конкретно, какие возможности доступны в generics, которые нельзя получить "обычными" классами, если не учитывать приведения типов?


Надоело отвечать. Переадресую этот вопрос тебе. С заменой дженерики на шаблоны.

>> ПК>Ошибся. Подразумевалось: http://rsdn.ru/Forum/Message.aspx?mid=1016014&amp;only=1
Автор: Павел Кузнецов
Дата: 08.02.05

>>
>> И? Опять млкие ужимки.

ПК>Не хами.


Какое фамство? Ты уже часа 4 откровенно называшь белое черным и пыташся найти какие-то зацпки для обоснования этого. Мне это уже порядком надоело.

>> Я алгоритм реализовал? Он обобщенный? Что еще? Код на Камеа не компилируется?


ПК>"Алгоритм" в данном случае сводится x + y.


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

ПК> Эту часть ты так в generics и не включил.


Дык эта часть не абстактна. В абстрактном коде все пучком. А это реализация частностей. Была бы в интерйейсе класса операция описана в виде метода и этого абстрагирования не потребовалось бы.

Шаблоны же как форменный макрос плют на неопределеность типов и все ОК. Вот только в шаблоне можно совсем невероятную чушь написать, а потом при появлении нового типа охренивать с простыми сообщений об ошибках.

ПК> Точнее, один вариант был, но основанный на "обычных", не generic средствах.


Так. Я алгоритм реализовал? Он обобщенный? Что еще? Если ответить не можешь, то одью.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.02.05 23:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ты потерял нить
Автор: AndrewVK
Дата: 10.01.05
:


Я?

ПК>

исходная мысль была о том, что большинство отличий в возможностях шаблонов имеют практическое значение при метапрограммировании, а не при дженерик-программировании

ПК>К этому тезису определение того, что же такое метапрограммирование, имеет самое наинепосредственнейшее отношение.

http://en.wikipedia.org/wiki/Metaprogramming

ПК>Речь об итераторах зашла до того, как я в этой ветке дал ссылку на Брюса Эккеля. Не путай все в одну кучу.


Вот порядок у этой кучи сообщений отследить трудно. Но трюк с итераторами был очень некрасив.

>> Я читаю внимательно. Упоминаний Шарпа в статье два. Оба в суе и бездоказательно.


ПК>Опровергни.


У него доказательств нет, а я должен опровергать? Хотя там и поровергать нечего.

>> ПК>

But in Java (and apparently C#), you can't seem to say "any type."

>>
>>

apparently нареч. <...> Как ты думашь, автор применил слово в первом или втором значении?

ПК>Абсолютно все равно, что означает "apparently". К C# все его рассуждения о Java применимы в полной степени со сделанными им оговорками о поддержке на уровне IL.

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

Если в шарпе в некий дженерик-метод передать вэлью-тип, то он убдет обработан именно как вэлью-тип. По всем правилам и с должносй скоростью. В Яве же он будет ссылочным типом с вытикающей семантикой и скоростью.

Далее в яве нет делегатов и в яве всегда существует только одна физическая раелизация дженерик-ласса. В Шарпе же если дженерик получает в качестве типа вэлью-тип, то создается отдельная специализация. Т.е. по сути получаетя поведение похожее на поведение шабонов С++.

ПК> В C# ты тоже, как и в Java, лимитирован интерфейсами. Подробнее см. в следующей статье, на которую, кстати, была ссылка из первой.

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

>> ПК>[q]C# also doesn't support latent typing, and although it has a better generics model than Java (since they went ahead and changed the underlying IL so that, for example, a static field in a class will be different between class and class). So if you want latent typing you'll have to use C++ or D (or Python, Smalltalk, Ruby, etc.).

>>
>> И что ты тут усмотрел? То что в Шарпе дженерики лучше?

ПК>Или же ты не можешь/не хочешь понять, о чем идет речь.


Ну, обясни. Или может ты пыташся понять, то чего нет?

ПК>Скорее менее, из-за мест, где приходится делать copy-paste.


От от неопытности. Все же подходы с плюсов не катят.

>> В общем, твои ужимки <...>


ПК>Помнишь фильм "Кукушка"? Я скоро буду вынужден обращаться к тебе так же, как к главному герою того фильма, если ты не прекратишь хамить.


Я не хамлю. В вижу попытки назвать белое черным, и мне это не нравится.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 08.02.05 23:58
Оценка: 12 (2) +1
VladD2,

> ПК> Это ж только пример. При попытке использования generics, например, для написания обобщенных матриц и векторов (в смысле линейной алгебры) ушьешься передавать туда делегаты. Будет самый настоящий copy-paste на стороне клиента.


> Не уешся. На каждый тип нужно ровно один делегат.


На каждую используемую операцию каждого используемого типа — по делегату.

> И передавать его не нужно. Положи ссылку в поле и используй. А если методов много, то заведи дженерик-интерфейс с ними.


Ага. Не работает. Методы такие: +, -, *, / и т.п., т.к. generic алгоритм должен работать и со встроенными типами.

> Реализация такого чуда — это пара пальцев об асфальт. Студия 90% работы слелает... За-то все четко специфицировано и явно.


Предлагаемая тобой автоматизация дублирования кода обобщенным программированием не является.

> ПК>Я все еще жду примера, где generics дают что-нибудь новое по сравнению с обычным классом, если закрыть глаза на приведение типов.

>
> Что нового можно найти после появления структурного программирования? Если я чего-то не понимаю, то держни... покажи класс. Сделай на шаблонах это новое, но без метапрограммирования, плиз.

Любой пример параметрического полиморфизма. Например:
template<class T>
Vector3<T> operator *( Vector3<T> const& v, T const& s )
{
   return Vector3<T>( v1.x * s, v1.y * s, v1.z * s );
}

Будет работать для любых скаляров T, начиная от int, float и заканчивая MyBigInt, MyRational, MyDecimal и т.п. В пример включен подразумеваемый шаблон Vector3<T> и т.п.

> ПК>Да, так яснее. Это же можно сделать и без generics. Они здесь ничего нового по сравнению с обычными классами не дают.

>
> Не, ну если все типы в object-ах, и постоянный боксинг-анбоксинг, да языком Шарп или Васик, то конечно. Ну, и если память и скорость невозна. Пишут же люди на скриптах? Но тут кто-то расскзаывал о типобезопасности, производительности и т.п. Это не ты был?

С точки зрения типобезопасности (кроме избавления от приведений типов, о чем мы уже упоминали) generics ничего не дают по сравнению с интерфейсами. Производительность у generics тоже не блещет. Впрочем, отсутствие необходимости в boxing/unboxing можно тоже добавить, но это уже речь об оптимизации, а не о возможностях.

> Мы вообще о чем? Ты как-то забавно выкручивашся. Что ты понимашь под обобщенным программированием?


В первую очередь — использование параметрического полиморфизма. Плюс можно пойти далее, но это для C# generics, очевидно, вообще, другая планета:
http://www.cs.rpi.edu/~musser/gp/
http://www.boost.org/more/generic_programming.html

> И какою качественную разницу ты видишь между дженериками и шаблонами?


В возможностях: шаблоны позволяют применять к объектам типов, заданных параметрами шаблона, любые операции, которые можно использовать вне шаблонов. Generics не позволяют.

> ПК> Уже написано. <boost/operators.hpp>


> Значит операторы уже мовитон?


Моветон не операторы, а copy-paste.

> ПК> Теперь вернемся к примеру выше, и ответим на вопрос: является ли конструкция ниже примером "статически типизированного программирования":

> ПК>
>>>         return (Adder<T>)Delegate.CreateDelegate(
>>>                 typeof(Adder<T>), typeof(T), "op_Addition");
> ПК>

> Нет. Но причем тут эта конструкция?

При том, что это был единственный способ, который ты нашел, чтобы избавиться от copy-paste при использовании generics. И к обобщенному программированию этот способ не относится.

> Вот эти конструкции
Автор: VladD2
Дата: 08.02.05
являются. К дженерикам относятся именно оин.


Этими средствами не получается выйти за рамки интерфейсов. Приходим к тому, с чего начали: кроме избавления от приведений типов generics ничего по сравнению с "обычными" классами не дают. (как верно было замечено, можно добавить избавление от boxing/unboxing, но сути это не меняет)
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[29]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 09.02.05 00:16
Оценка: +1
VladD2,

> ПК>На уровне возможностей generics? Пишешь обычный класс + шаблон-обвязку, приводящую аргументы и результаты функций. Класс экспортируется, шаблон включается обычным #include. Все, справился.

>
> Ну, тоесть нельзя? Шаблон инклюдами... дальше уже можно не продолжать. Если хоть один метод с параметром типа скомпилирован, то новых специализаций уже не породить.

Легко. Они будут порождаться клиентом. "Рабочий" код будет в .dll.

> А можно узнать что нового привносят в данном разрезе шаблоны?


Кроме переноса диагностики в статуку — замена copy-paste. Везде, где нужно было копировать код, можно заменить это на шаблон. Generics полностью эту задачу не решают.

> ПК>Разными. Параметрический полиморфизм (aka основной инструмент обобщенного программирования) позволяет писать код идентичным образом для разных типов. Generics ограничивают множество конструкций до тех же, что доступны в "обычных", не generic, классах.


> Чушь какая. Все что ты пишашь на шаблонах можно написать и в с использованием динамического полиморфизма и приведений типов.


Ага. Для int, например.

>>> ПК>Ошибся. Подразумевалось: http://rsdn.ru/Forum/Message.aspx?mid=1016014&amp;only=1
Автор: Павел Кузнецов
Дата: 08.02.05

>>>
>>> И? Опять млкие ужимки.
>
> ПК>Не хами.
>
> Какое фамство? Ты уже часа 4 откровенно называшь белое черным и пыташся найти какие-то зацпки для обоснования этого. Мне это уже порядком надоело.

Можно и по-другому повернуть: ты уже 4 часа откровенно не понимаешь, где черное, а где белое, да еще и хамишь. Мне это уже порядком надоело.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 09.02.05 00:22
Оценка:
VladD2,

> ПК>

исходная мысль была о том, что большинство отличий в возможностях шаблонов имеют практическое значение при метапрограммировании, а не при дженерик-программировании

> ПК>К этому тезису определение того, что же такое метапрограммирование, имеет самое наинепосредственнейшее отношение.

> http://en.wikipedia.org/wiki/Metaprogramming


Как, исходя из этого определения возможность использования операторов, вызова статических функций, создания объектов, параметризации целыми, явная и частичная специализация и т.п. относятся к метапрограммированию?

> ПК>Речь об итераторах зашла до того, как я в этой ветке дал ссылку на Брюса Эккеля. Не путай все в одну кучу.

>
> Вот порядок у этой кучи сообщений отследить трудно. Но трюк с итераторами был очень некрасив.

Дык, не надо приводить такие примеры/аргументы.

> ПК>Абсолютно все равно, что означает "apparently". К C# все его рассуждения о Java применимы в полной степени со сделанными им оговорками о поддержке на уровне IL.


> Так к сведению... Разница между дженериками явы и шарпа в том, что дженерики шарпа умеют работать с вэльютипами. При этом получается эффективный код. Ява же вообще не поддерживает вэльютипы в качесвте параметров шаблонов. Вместо этого в нее введен автобоксинг и внешне код выглядит как будто он работает с вэлью-типами. Но на самом деле в коде идут настаящие операции боксинга/анбоксинга (что можно расценить как автоматическое приведение типов).


"Но в песне ты не понял, увы, ничего". Эффективность в данном случае абсолютно побоку.

> ПК> В C# ты тоже, как и в Java, лимитирован интерфейсами. Подробнее см. в следующей статье, на которую, кстати, была ссылка из первой.


> Спасибо, но сдается мне эта тема мне знакома несколько лучше чем тебе, и скорее всего чем ему.


О какие пошли аргументы! Можно использовать мощные контр-аргументы: You have no clue. Absolutely. Перевожу: "Ты не рубишь. Совсем". Или еще вариант: "Нет, он/я/кто угодно лучше, чем ты шарит в этом"... В общем, лучше бы ты по существу говорил, если есть что, чем хвастаться.

> ПК>Скорее менее, из-за мест, где приходится делать copy-paste.

>
> От от неопытности. Все же подходы с плюсов не катят.

Так, куда мне сирому, если даже ты, опытный, не смог от copy-paste в такой простой вещи как x + y избавиться...

>>> В общем, твои ужимки <...>

>
> ПК>Помнишь фильм "Кукушка"? Я скоро буду вынужден обращаться к тебе так же, как к главному герою того фильма, если ты не прекратишь хамить.
>
> Я не хамлю. В вижу попытки назвать белое черным, и мне это не нравится.

Я могу адресовать то же самое и тебе. Просто у нас, как это часто бывает, очень различные взгляды на то, что есть черное, а что есть белое.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[22]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.02.05 02:17
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>На каждую используемую операцию каждого используемого типа — по делегату.


Если их более одной используй дженерик-интерфейс.

ПК>Ага. Не работает. Методы такие: +, -, *, / и т.п., т.к. generic алгоритм должен работать и со встроенными типами.


Опять же интерейс тебе поможет. Кто скзал, что его нужно реализовывать в типе? Сделай хэлпер. Ты же в С++ передаешь через параметр разные Аллокаторы и т.п. Ну, вот и тут. Творишь нечто вроде:
interface INumberOperations<T>
{
    T Add(T x, T y);
    T Sub(T x, T y);
    T Mul(T x, T y);
    T Div(T x, T y);
    T Ect(T x, T y);
}

Далее для каждого своего типа заводишь по классу NumberOperations<ЭтотСамыйТип> и реализуешь эти операции в нем.
Ну, а во всех классах алгоритмов и т.п. хранишь ссылку на INumberOperations<T>.

Трудозатраты почти нулевые. Интерфейс чистый. Возможно динамически менять объект операций.

ПК>Предлагаемая тобой автоматизация дублирования кода обобщенным программированием не является.


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

>> Что нового можно найти после появления структурного программирования? Если я чего-то не понимаю, то держни... покажи класс. Сделай на шаблонах это новое, но без метапрограммирования, плиз.


ПК>Любой пример параметрического полиморфизма. Например:

ПК>
ПК>template<class T>
ПК>Vector3<T> operator *( Vector3<T> const& v, T const& s )
ПК>{
ПК>   return Vector3<T>( v1.x * s, v1.y * s, v1.z * s );
ПК>}
ПК>

ПК>Будет работать для любых скаляров T, начиная от int, float и заканчивая MyBigInt, MyRational, MyDecimal и т.п. В пример включен подразумеваемый шаблон Vector3<T> и т.п.

1 в 1 можно сделать на шарпе. Только вместо операций будут методы или объект-хэлпер. Разницы никакой.

ПК>С точки зрения типобезопасности (кроме избавления от приведений типов, о чем мы уже упоминали) generics ничего не дают по сравнению с интерфейсами.


Не, ну так самую млосьть они все же дают, если уж смотреть "с точки зрения типобезопасности". Они дают ту самую статическую проверку типов при отсуствии дублирования кода. Если ты еще что-то знаешь о типобезопасности, то поведай. Может я чего в этой жизни пропустил?

ПК> Производительность у generics тоже не блещет.


Ну, это чушь. Без них написать производительный полиморфный код под час просто не возможно. Ты почитал бы статейку то: http://gzip.rsdn.ru/article/csharp/newincsharp.xml
Автор(ы): Владислав Чистяков (VladD2)
Дата: 24.06.2004
В статье рассказывается о новшествах, которые должны появиться в новой версии языка C#

. Там забавный график есть. К сведенью, пункт "Array (CLR)" — это версия (гы-гы) оптимизированная на С++ с использованием шаблонов. Так вот убокие дженерики несколько быстрее. А вот небоскребы рядом — это как раз полиморфные решения. Боксинг из них самое дешевое (опять же гы-гы).

А еще могу вспомнить С-шный qsort который сливал моим тестам на шаблонах в разы. Так что ненада. А будет человеческий оптимизатор, так вообще разницы с VC не будет. Ну, а разные БЦЦ шарп и сейчас порой рвет.

ПК> Впрочем, отсутствие необходимости в boxing/unboxing можно тоже добавить, но это уже речь об оптимизации, а не о возможностях.


А о чем еще можно говорить если речь зашла о скорости кода? Или опять возвращаемся про никие мифическип архитектурные недостаткои дотнета или Шарпа?

>> Мы вообще о чем? Ты как-то забавно выкручивашся. Что ты понимашь под обобщенным программированием?


ПК>В первую очередь — использование параметрического полиморфизма.


И его в дотнете нет? О как?! Т.е. запрет на пямое использование операторов уже смертный приговор. То-то я в своем коде еще ни одного дженерика не написал где это понадобиться могло бы, а дженериков тонна.

ПК> Плюс можно пойти далее, но это для C# generics, очевидно, вообще, другая планета:

ПК>http://www.cs.rpi.edu/~musser/gp/
ПК>http://www.boost.org/more/generic_programming.html

Ну, т.е. пример именно обобщенного алгоритма не реализуемого на шарпе ты привести не в силах, но дальше кидашся ссылками и с понтом рассуждаешь про другие планеты? Или к обобщенному программированию имеют отношение "Type Generators" и другая метапрограммная бустовская хрень?

>> И какою качественную разницу ты видишь между дженериками и шаблонами?


ПК>В возможностях: шаблоны позволяют применять к объектам типов, заданных параметрами шаблона, любые операции, которые можно использовать вне шаблонов. Generics не позволяют.


>> ПК> Уже написано. <boost/operators.hpp>


>> Значит операторы уже мовитон?


ПК>Моветон не операторы, а copy-paste.


>> ПК> Теперь вернемся к примеру выше, и ответим на вопрос: является ли конструкция ниже примером "статически типизированного программирования":

>> ПК>
>>>>         return (Adder<T>)Delegate.CreateDelegate(
>>>>                 typeof(Adder<T>), typeof(T), "op_Addition");
>> ПК>

>> Нет. Но причем тут эта конструкция?

ПК>При том, что это был единственный способ, который ты нашел, чтобы избавиться от copy-paste при использовании generics. И к обобщенному программированию этот способ не относится.


>> Вот эти конструкции
Автор: VladD2
Дата: 08.02.05
являются. К дженерикам относятся именно оин.


ПК>Этими средствами не получается выйти за рамки интерфейсов. Приходим к тому, с чего начали: кроме избавления от приведений типов generics ничего по сравнению с "обычными" классами не дают. (как верно было замечено, можно добавить избавление от boxing/unboxing, но сути это не меняет)
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Экспорт шаблонов
От: McSeem2 США http://www.antigrain.com
Дата: 09.02.05 02:28
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Дык, не ты ли говорил, что если что мы по бырому генератор кода сварганим?


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

VD>Сдается мне, что все несколько проще. Это ты своих тараканов размножаешь.


Я не размножаю — они сами размножаются. И главное средство их размножения — это тот самый copy-paste. А я их стараюсь давить — душили-душили, душили-душили...

MS>>На голом Си это можно хотя-бы дефайнами сделать (тяжело, некрасиво, но можно). Ни на Java, ни на C#, ни на Фортнане задача не решается в принципе.


VD>О как. А значит препроцессор у нас религия для Явы или Шарпа запрещает использовать?


Это не религия не позволяет — это практика не позволяет. Вот представь, что я отдаю исходник на C# или Java заказчику весь в дефайнах и ифдефах, и говорю — а компилируйте через cpp.exe и всех делов. В какое место я буду послан?
Короче говоря, надо пользоваться естественными средствами языка. Сишный препроцессор для Си — естественное явление — просто берешь и компилируешь. Тот же самый препроцессор для C# — нонсенс.
Представь, вот просто представь — кто-то решил внести свой вклад в R# и пишет код, который надо обрабатывать Сишным препроцессором. В какое место ты сам его пошлёшь? И будешь прав, что характерно.

VD>А по уму твоя проблема решается кодогенератором. Качаешь R# или КодСмит и через пять минут решение твоей неразрешимой проблемы. Причем чистое, красивое, и легко отлаживаемое.


О! Насчет "чистое и красивое" — это станет возможным только тогда, когда этот самый R# будет встроен в язык и стандартную поставку. Когда это случится? Насчет "легко отлаживаемое" — не верю вообще.
template<int N> void copy(. . .)
{
   repeat<N> { *p++ = *s++; }
}


Заметь, что в фигурных скобках может быть весьма нетривиальный код.
Ну, и как это дело трассировать в отладчике (вне зависимости от языка)? Как это решено в кодогенераторе R#?
Здесь только два варианта — либо трассировать не исходный текст, а результат работы кодогенератора (представь, что Сишный отладчик выдает не исходник, а некую абракадабру после обработки препроцессором), либо же не трассировать вообще — как в случае Сишных макросов. Третий вариант — отладчик должен умно разворачивать данные конструкции — типа как при трассировке ассемблерного кода в студии. А это означает, что отладчик должен знать, что есть такое слово, как R#. Так когда это все будет? Мы ждем с нетерпением...

В общем, благодаря этой дискуссии я наконец-то понял, что шаблоны отличаются от макросов тем, что код шаблонов можно трассировать, а код макросов — нельзя. Шаблоны — страшная сила!
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[23]: Экспорт шаблонов
От: Павел Кузнецов  
Дата: 09.02.05 04:40
Оценка: +1
VladD2,

> ПК> Ага. Не работает. Методы такие: +, -, *, / и т.п., т.к. generic алгоритм должен работать и со встроенными типами.


> Опять же интерейс тебе поможет. Кто скзал, что его нужно реализовывать в типе?


Я сказал. Эти типы должны быть удобны в использовании и без шаблонов. Плюс это все хозяйство должно работать со встроенными типами и с типами из сторонних библиотек.

> Сделай хэлпер. Ты же в С++ передаешь через параметр разные Аллокаторы и т.п.


Я о них забочусь только когда они мне нужны (в частности аллокаторы — три или четыре раза за все время). В остальных случаях они под руками не мешаются, т.к. их явно указывать не нужно. С generics это не пройдет: там все нужно будет делать явно, т.к. даже специализаций нет.

> ПК>
> ПК>template<class T>
> ПК>Vector3<T> operator *( Vector3<T> const& v, T const& s )
> ПК>{
> ПК>   return Vector3<T>( v1.x * s, v1.y * s, v1.z * s );
> ПК>}
> ПК>

> ПК>Будет работать для любых скаляров T, начиная от int, float и заканчивая MyBigInt, MyRational, MyDecimal и т.п. В пример включен подразумеваемый шаблон Vector3<T> и т.п.

> 1 в 1 можно сделать на шарпе. Только вместо операций будут методы или объект-хэлпер. Разницы никакой.


Методы чего? А если это не оператор *, а вспомогательная функция, которая не может быть членом Vector3<>, т.к. этот класс в библиотеке, а функция — в моем приложении? В C# не будет работать потому что: нельзя вызвать * для T, нельзя вызвать конструктор для Vector3<T>.

> ПК> Впрочем, отсутствие необходимости в boxing/unboxing можно тоже добавить, но это уже речь об оптимизации, а не о возможностях.


> А о чем еще можно говорить если речь зашла о скорости кода?


Речь о скорости кода завел ты. Я говорил о возможностях, направленных на облегчение повторного использования кода.
Posted via RSDN NNTP Server 1.9
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Экспорт шаблонов
От: prVovik Россия  
Дата: 11.02.05 08:17
Оценка: +1
Здравствуйте, VladD2, Вы писали:


VD>Тут и параметризация константами,

Ну и что? Или если этого нет в генериках, то оно автоматически сразу становится метопрограммированием?

VD>и изменение структуры кода при изменении параметра типа.

Семантически код абсолютно не меняется. То, что там происходит на уровне ассемблера, мне по барабану.

VD>Натуральная кодогенерация. И потому легко решается с помощью макросов и кодогенераторов.

А list<T> — это тоже натуральная кодогенерация? Ведь оно тоже "легко решается с помощью макросов и кодогенераторов"?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[29]: Экспорт шаблонов
От: prVovik Россия  
Дата: 11.02.05 08:34
Оценка: +1
Здравствуйте, VladD2, Вы писали:


VD>В отсуствии необходимости применения боксинга, наследования, виртуальных методов. В применимости к вэлью-типам. В общем, во всем в том, что касается и шаблонов. В итоге статическая типобезопастность и повешение скорости.


Ага, то есть ты признаешь, что с семантической точки зрания генерики не привносят ничего, кроме отсутствия необходимости делать приведения типов, а все их остальные бонусы сводятся к оптимизации?

Ну если так, то я напомню, что возможности по оптимизации, предоставляемые генериками — это просто ДЕТСКИЙ САД, по сравнению с оптимизацией на шаблонах! Надеюсь, это доказывать не придется?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[29]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.05 21:05
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, VladD2, Вы писали:



VD>>Тут и параметризация константами,

V>Ну и что? Или если этого нет в генериках, то оно автоматически сразу становится метопрограммированием?

Нет или есть тут не причем. Но параметризация константами никакого отношения к обобщенному программированию не имеет. Обобщенное — значит применимое для любого типа. Параметризация же константами — это чистый макросный стиль, или метапрограммирование.

VD>>и изменение структуры кода при изменении параметра типа.

V>Семантически код абсолютно не меняется. То, что там происходит на уровне ассемблера, мне по барабану.

Если константы просто подставляются, то тоже самое можно добиться простым заданием констант в классе или заменой их на переменные. Если же константы начинают влиять на алгоритм (менять код), то это четкий признак применения шаблонов для метапрограммирования.

VD>>Натуральная кодогенерация. И потому легко решается с помощью макросов и кодогенераторов.

V>А list<T> — это тоже натуральная кодогенерация? Ведь оно тоже "легко решается с помощью макросов и кодогенераторов"?

Еесли классы/методы отличаются только абстрагированностью от конкретных типов, то это обобщенное программирование. Если имеется элементы кодогенерации — это это уже нечто выходящее за рамки обобщенного программирования.

Несмоненно с помощью метапрограммирования можно эмулировать практически любые расширения ЯП, но это уже отдельный вопрос имеющий опосредованное отношение.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.05 21:05
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Наверное не я. Напомни-ка.


Ну, возможно не ты. Сейчас найти уже тяжело.

MS>Я помню то, что я говорил о необходимости иметь встроенный в язык макропроцессор, а не привешенный сверху. Но это уже — совсем другой коленкор.


Я так понимаю — это очередной комплекс пасивности. Если чего-то нет, то этого нет в принципе... Позиция обычно стречается у молодых и не оптыных. От тебя слашать такие слова странно.

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

MS>Я не размножаю — они сами размножаются. И главное средство их размножения — это тот самый copy-paste. А я их стараюсь давить — душили-душили, душили-душили...


Хреново ты их давишь. У меня вот ничто само не размножается.

MS>Это не религия не позволяет — это практика не позволяет. Вот представь, что я отдаю исходник на C# или Java заказчику весь в дефайнах и ифдефах, и говорю — а компилируйте через cpp.exe и всех делов. В какое место я буду послан?


Думаю, что эту ситуацию ты только что сам придумал. Зачем заказчику исходный код? Им продукт нужен. Если они исходники и возьмут, то только в качестве защиты от тебя любимого, чтбы если что отдать их другому программисту. И уж смотреть на то чем что компилируется точно не будут. Им достаточно будет сказать, что для компиляции нужно иметь установленную VS.

MS>Короче говоря, надо пользоваться естественными средствами языка. Сишный препроцессор для Си — естественное явление — просто берешь и компилируешь. Тот же самый препроцессор для C# — нонсенс.


Ествественно все что удобно. Если ты в своей голове не можешь уйти дальше стереотипов и штампов, то это твои личные проблемы.

Использовать С-шный препроцессор в Шарпе большинство не будет по совсем другим причинам. Проблем от него куда болше чем пользы. Код сгенерировать можно и на других средствах. Причем получится и проще, и удобнее и безопаснее. Отладка шаблонов и потенциальные проблемы от них — это очень плохое поспорье для больших проектов.

MS>Представь, вот просто представь — кто-то решил внести свой вклад в R# и пишет код, который надо обрабатывать Сишным препроцессором. В какое место ты сам его пошлёшь? И будешь прав, что характерно.


С-шный прероцессор — это дерьмо. Его возможности с R# и рядом не стояли. Именно по этому R# делается на R#-е. И именно по этому в нем нет С-шного препроцессора. Ведь если бы С-ный препроцессор был нормальным решением, то R# просто был бы не нужен.

VD>>А по уму твоя проблема решается кодогенератором. Качаешь R# или КодСмит и через пять минут решение твоей неразрешимой проблемы. Причем чистое, красивое, и легко отлаживаемое.


MS>О! Насчет "чистое и красивое" — это станет возможным только тогда, когда этот самый R# будет встроен в язык и стандартную поставку.


Ну, для примитивных личностей с трудом освоивших текстовый процессор наврно. А так... лигического обоснования необходимости быть встроенным в язык я не вижу.

Конечно было бы не плохо продумать все моменты более детально и сделать работу с метакодом и его результатом боле удобным. Однако и это не означает встраивания в язык.

Простой пример... В Шарп 2.0 встроены итераторы. Их с успехом можно было сделать на R#-е уже сейчас. Причем выглядело бы это точно так же как сейчас. Вот только алгоримт работы итераторов можно было бы сделать куда более гибким и настраиваемым. Думаю, когда нибудь это появится и в средсвах разработки от иминитых поставщиков. Ну, а пока те кто по линивее и по тупее будут ждать милости от природы, а мы потихоньку возмем их сами.

MS> Когда это случится? Насчет "легко отлаживаемое" — не верю вообще.


Я я не привых здать реализации счастья большими дядями. У меня своя голова и руки есть.

MS>Ну, и как это дело трассировать в отладчике (вне зависимости от языка)? Как это решено в кодогенераторе R#?

MS>Здесь только два варианта — либо трассировать не исходный текст, а результат работы кодогенератора (представь, что Сишный отладчик выдает не исходник, а некую абракадабру после обработки препроцессором), либо же не трассировать вообще — как в случае Сишных макросов. Третий вариант — отладчик должен умно разворачивать данные конструкции — типа как при трассировке ассемблерного кода в студии. А это означает, что отладчик должен знать, что есть такое слово, как R#. Так когда это все будет? Мы ждем с нетерпением...

Ты затронул довольно сложную тему. Я сам много раз думал над этим. То как сделано в современных средах С/С++ — это точно никуда не годящееся решение. Отладка сложных макросов — это полнейший мрак.

Пока что лично я склоняюсь к отладке по сгенерированному коду. В принципе уже многие консрукции порождающие сложный код можно и не раскрывать. Но это уже после того как они были отлажены. А на этапе отладки необходимо иметь возможность отладки по генерируемому коду. В приципе это решается за счет атрибутов и фич вроде #line.

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

В общем, эта тема заслуживает отдельного обсуждения. И говорить о ней вот так между делом бессмысленно. Проблема или имеет свое решение, и тогда для ее решения совершенно нет нужны что-то куда-то интегрировать. Или не имеет, но тогда все рассуждения об интеграции опять же бессмысленны.

MS>В общем, благодаря этой дискуссии я наконец-то понял, что шаблоны отличаются от макросов тем, что код шаблонов можно трассировать, а код макросов — нельзя. Шаблоны — страшная сила!


Шаблоны главным образом отличаются от макросов тем, что они синтаксически управляемы. Они не генерят текст. Они генерят АСТ. Собственно это же делает и R#. А отлаживать их проще потому, что они не имеют штатных средств генерации кода. Но как только путем использования побочных эффектов с помощью макросов начинают генерировать код, то отладка оного становится невыносимо тежелой. Ведь в рекурсивных шаблонах точку остонова не поставишь. И результат генерируемых Локи кодов увидить в общем-то нельзя. Все только подразумевается, а — это уже перегрузка мозгов. Причем совершенно не нужная.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.05 21:05
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Легко. Они будут порождаться клиентом. "Рабочий" код будет в .dll.


На базе чего они будут порождаться? В длл может быть только специализация. Так что или длл не нужна, так как весь код в заголовочном файле, или мы не может порождать специализаций не предусмотренных в длл-е.

>> А можно узнать что нового привносят в данном разрезе шаблоны?


ПК>Кроме переноса диагностики в статуку — замена copy-paste. Везде, где нужно было копировать код, можно заменить это на шаблон. Generics полностью эту задачу не решают.


Чушь. И ты это знаешь.

ПК>Ага. Для int, например.


А чем он отличается если мы плюем на производительность? В те же Питонах и лиспах int-ы — это такие же ссылочные типы. Потому они так полиморфны. Плата только в скорости и статической типизации.

ПК>Можно и по-другому повернуть: ты уже 4 часа откровенно не понимаешь, где черное, а где белое, да еще и хамишь. Мне это уже порядком надоело.


Я называю вещи своими именами. Откровенно непрыкрытое нежелание признавать очевидные вещи я так и называю. И если ты называшь мои слова хамством, то твои никак кроме лицемерия назвать не получается.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[30]: Экспорт шаблонов
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.02.05 21:05
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, VladD2, Вы писали:



VD>>В отсуствии необходимости применения боксинга, наследования, виртуальных методов. В применимости к вэлью-типам. В общем, во всем в том, что касается и шаблонов. В итоге статическая типобезопастность и повешение скорости.


V>Ага, то есть ты признаешь, что с семантической точки зрания генерики не привносят ничего, кроме отсутствия необходимости делать приведения типов, а все их остальные бонусы сводятся к оптимизации?


Дженерики привросят качественное изменение. Они позволяют писать статически проверяемый код для набора неких абстрактных типов. Именно для этого и были в свое время созданны шаблоны.

Это качественное отличие.

Можно ли без него жить? Можно.
Можно ли решать задачи без обобщенного программирования? Можно.
Является ли динамический полиморфизм нормальной заменой статическому? Нет.

V>Ну если так, то я напомню, что возможности по оптимизации, предоставляемые генериками — это просто ДЕТСКИЙ САД, по сравнению с оптимизацией на шаблонах! Надеюсь, это доказывать не придется?


Это заблуждение. И как любое заблуждение его доказывать не нужно.
... << RSDN@Home 1.1.4 beta 3 rev. 279>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.