Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 342 343 [344] 345 346 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5146
,
|
|
|
|
Что такое C<?>? Как пользователю помогут обёртки в его желании? |
|
Сообщ.
#5147
,
|
|
|
|
Цитата MyNameIsIgor @ Что такое C<?>? Как пользователю помогут обёртки в его желании? это любой класс, реализующий все методы в шаблоне. а обертки наверное помогут так: ![]() ![]() template<class T> class A { public: void foo() {} void bar() {} }; class YourClass { public: void foo() {} }; // ---- class Wrapper { private A<YourClass> your; public void foo() { your.foo(); } void bar() {} }; но я пока не очень хорошо понимаю синтаксис шаблонов, поэтому хз как оно там на самом деле. |
|
Сообщ.
#5148
,
|
|
|
|
Цитата korvin @ но я пока не очень хорошо понимаю синтаксис шаблонов, поэтому хз как оно там на самом деле. Я понял мысль. Цитата korvin @ это любой класс, реализующий все методы в шаблоне. Чтобы пользователь мог вызывать все методы, объявленные в шаблоне, ему нужно отдать аргументом шаблона класс, удовлетворяющий всем требованиям шаблона - т.е. прочитать документацию. Если он не может изменить этот класс, то да, как один из вариантов то, что вы показали. С другой стороны нужно понимать, что дженерики здесь в таком же положении. Преимущества шаблонов проявляются, например, в таком примере. Попробуйте его переписать на джавошарп и поймёте разницу. |
|
Сообщ.
#5149
,
|
|
|
|
Цитата MyNameIsIgor @ С другой стороны нужно понимать, что дженерики здесь в таком же положении. у них же нет "частичной" реализации, только "полная", хотя за шарп конечно утверждать не могу. а по-поводу примера. тут дело не только в шаблонах, но ведь сделать такое можно и без шаблонов, но это уже завтра. =) |
|
Сообщ.
#5150
,
|
|
|
|
Цитата korvin @ у них же нет "частичной" реализации, только "полная", хотя за шарп конечно утверждать не могу. В данном вопросе (и чаще всего) джава и шарп - одна хрень. Цитата korvin @ а по-поводу примера. тут дело не только в шаблонах, но ведь сделать такое можно и без шаблонов, но это уже завтра. =) Гммм... Вы полагаете, что я вас попросил посчитать количество слов? Я не сомневаюсь, что посчитаете, вы просто код напишите |
|
Сообщ.
#5151
,
|
|
|
|
Цитата korvin @ "Причём тут" не динамика, а разница и сложность достижения цели. да при чем тут динамика? я могу и в динамике сделать необязательность реализации, а в статичном хаскелле требуется _полностью_ инстанциировать тайпкласс для типа. иначе не скомпилится Добавлено Цитата korvin @ Нет класса C<>, есть шаблон класса C<>. Если затем, что пользователь может хотеть пользоваться вашим классом как C<?>, а не как C<T> ![]() ![]() template <typename T> class blah_blah { C<T> x; /* ... */ }; ![]() ![]() template <typename T> class blah_blah { T x; /* ... */ }; По-настоящему не завершённый тип с позволением пользователю заменить шаблонную сущность он получает так: ![]() ![]() template <typename T, template <typename> class X> class blah_blah { X<T> x; /* ... */ }; |
|
Сообщ.
#5152
,
|
|
|
|
А разве шаблоны нельзя ограничивать конкретным(и) классом(и)? ![]() ![]() TMyClass = class public procedure Foo; procedure Bar; end; TSomeClass<T: TMyClass> = class ... end; |
|
Сообщ.
#5153
,
|
|
|
|
А зачем?
Ну, можно ![]() ![]() template <typename T> class TSomeClass; template <> class TSomeClass<TMyClass> { /* ... */ }; Добавлено Так у вас-таки есть специализации, чикак? |
|
Сообщ.
#5154
,
|
|
|
|
Есть пара минусов: - типы необходимо регистрировать заранее. - нет проверки на этапе компиляции, на случай если необходимый тип не зарегистрирован в фабрике. И в крупных и в мало-мальских, и просто на узких участках, везде не обойтись. Я не в курсе, а есть ли возможность при (точнее после) инстанции шаблона класса выполнить свой произвольный код? Т.е. можно ли получить, извиняюсь за тавтологию, аналог классового конструктора класса? Цитата D_KEY @ А если ты имел в виду объекты, то такое определение противоречит понятию конструктор. Так что в С++ тут все логично. Чем противоречит? Да мы уже разбирались и выяснили, что и в С++ конструкторы производных классов по сути тоже ничего не конструируют, а просто исполняют код в своём теле. Добавлено Цитата Qraizer @ А зачем? Корвин уже наверное объяснял. Цитата Qraizer @ Так у вас-таки есть специализации, чикак? Общие ограничения: либо классами, либо рекордами. И специализированные: либо конкретным базовым классом, либо одним или более интерфейсами. Добавлено Цитата korvin @ кстати, в Delphi, емнип, тоже есть классы, соответствующие базовым типам (TInteger для Integer и т.п.). или не? Не |
|
Сообщ.
#5155
,
|
|
|
|
Цитата MyNameIsIgor @ Гммм... Вы полагаете, что я вас попросил посчитать количество слов? Я не сомневаюсь, что посчитаете, вы просто код напишите ![]() нет, я полагаю несколько другое, но может Вы уточните, на что именно мне обратить внимание в том примере? |
|
Сообщ.
#5156
,
|
|
|
|
Цитата DesweR @ А... Ну это ещё нормально. Общие ограничения: либо классами, либо рекордами. И специализированные: либо конкретным базовым классом, либо одним или более интерфейсами. Добавлено Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"? |
|
Сообщ.
#5157
,
|
|
|
|
Цитата Qraizer @ Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"? Не так наверное выразился, "либо от конкретного базового класса". Т.е. нет, отсеять ничего не получится, в качестве параметра будет подходить любой производный класс. Добавлено Цитата Qraizer @ Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"? Гмм... а вообще что спросить то хотел? |
|
Сообщ.
#5158
,
|
|
|
|
Цитата DesweR @ Да мы уже разбирались и выяснили, что и в С++ конструкторы производных классов по сути тоже ничего не конструируют Вы что-то не то выяснили. Перечитайте тему. Цитата korvin @ нет, я полагаю несколько другое, но может Вы уточните, на что именно мне обратить внимание в том примере? Вот это же самое на шарпе. Теперь вопрос: почему ![]() ![]() for(auto w : words) ++words_count[w]; превратилось в ![]() ![]() foreach(var w in words) if(words_count.ContainsKey(w)) words_count[w]++; else words_count.Add(w, 1); ? Добавлено Цитата Qraizer @ Так у вас-таки есть специализации, чикак? У них не специализации. У них ограничения на |
|
Сообщ.
#5159
,
|
|
|
|
Цитата MyNameIsIgor @ Вот это же самое на шарпе. Теперь вопрос: почему ![]() ![]() for(auto w : words) ++words_count[w]; превратилось в ![]() ![]() foreach(var w in words) if(words_count.ContainsKey(w)) words_count[w]++; else words_count.Add(w, 1); ? потому что авторы шарпового Dictionary посчитали, что неявное создания пары ключ/значение не нужно? и Вы не смогли это преодолеть? |
|
Сообщ.
#5160
,
|
|
|
|
Цитата korvin @ и Вы не смогли это преодолеть? Это действительно раздражает Цитата korvin @ потому что авторы шарпового Dictionary посчитали, что неявное создания пары ключ/значение не нужно? А что бы случилось, если бы они посчитали это нужным? |