На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 342 343 [344] 345 346 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата korvin @
    затем, что пользователь может хотеть пользоваться вашим классом как C<?>

    Что такое C<?>? Как пользователю помогут обёртки в его желании?
      Цитата MyNameIsIgor @
      Что такое C<?>? Как пользователю помогут обёртки в его желании?

      это любой класс, реализующий все методы в шаблоне. а обертки наверное помогут так:
      ExpandedWrap disabled
        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() {}
        };


      но я пока не очень хорошо понимаю синтаксис шаблонов, поэтому хз как оно там на самом деле.
        Цитата korvin @
        но я пока не очень хорошо понимаю синтаксис шаблонов, поэтому хз как оно там на самом деле.

        Я понял мысль.
        Цитата korvin @
        это любой класс, реализующий все методы в шаблоне.

        Чтобы пользователь мог вызывать все методы, объявленные в шаблоне, ему нужно отдать аргументом шаблона класс, удовлетворяющий всем требованиям шаблона - т.е. прочитать документацию. Если он не может изменить этот класс, то да, как один из вариантов то, что вы показали. С другой стороны нужно понимать, что дженерики здесь в таком же положении. Преимущества шаблонов проявляются, например, в таком примере. Попробуйте его переписать на джавошарп и поймёте разницу.
        Сообщение отредактировано: MyNameIsIgor -
          Цитата MyNameIsIgor @
          С другой стороны нужно понимать, что дженерики здесь в таком же положении.

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

          а по-поводу примера. тут дело не только в шаблонах, но ведь сделать такое можно и без шаблонов, но это уже завтра. =)
            Цитата korvin @
            у них же нет "частичной" реализации, только "полная", хотя за шарп конечно утверждать не могу.

            В данном вопросе (и чаще всего) джава и шарп - одна хрень.
            Цитата korvin @
            а по-поводу примера. тут дело не только в шаблонах, но ведь сделать такое можно и без шаблонов, но это уже завтра. =)

            Гммм... Вы полагаете, что я вас попросил посчитать количество слов? :D Я не сомневаюсь, что посчитаете, вы просто код напишите :)
              Цитата korvin @
              да при чем тут динамика? я могу и в динамике сделать необязательность реализации, а в статичном хаскелле требуется _полностью_ инстанциировать тайпкласс для типа. иначе не скомпилится
              "Причём тут" не динамика, а разница и сложность достижения цели.

              Добавлено
              Цитата korvin @
              затем, что пользователь может хотеть пользоваться вашим классом как C<?>, а не как C<T>
              Нет класса C<>, есть шаблон класса C<>. Если пользователь (сорри) автор захочет воспрользоваться неким типом и напишет
              ExpandedWrap disabled
                template <typename T>
                class blah_blah
                {
                  C<T> x;
                /* ... */
                };
              то blah_blah<some_type> по-любому будет использовать конкретный тип C<some_type>. Да, различный для разных some_type, но в каждом случае конкретный и завершённый. Он не сможет перейти от одного C<> к другому никак, кроме как задать для него иной параметр, отличный от аргумента T. Но он не сможет и заменить C, кроме как использовать другой шаблон, например, D<T>. И C<>, и D<> тут являются явными именами шаблонных сущностей, так или иначе не подлежащими для замены пользователем. Или он может написать
              ExpandedWrap disabled
                template <typename T>
                class blah_blah
                {
                  T x;
                /* ... */
                };
              и пользовать blah_blah<C<some_type> >, но и тут в blah_blah параметром приходит конкретный и завершённый C<some_type> для любого some_type, и для каждого some_type тоже различный. Но тут он даже C<> на D<> заменить не сможет. Вообще никак. Ибо T параметризирует тут цельный тип, и является ли он C<some_type>, или D<some_type>, или даже просто int, шаблону неведомо.
              По-настоящему не завершённый тип с позволением пользователю заменить шаблонную сущность он получает так:
              ExpandedWrap disabled
                template <typename T, template <typename> class X>
                class blah_blah
                {
                  X<T> x;
                /* ... */
                };
              Пользователь может теперь использовать blah_blah<some_type, C> или blah_blah<some_type, D>, на своё усмотрение. Теперь в blah_blah<> вторым аргументом принимается именно шаблон, а не завершённый тип. И вместо него нельзя подставить конкретный тип, примется только шаблон со строго одним аргументом-типом. Шаблоны - не завершённые типы. Однако C++ при кодогенерации, чем в конце концов заканчивается компиляция любой единицы трансляции, не может работать с не завершёнными типами. Так или иначе все типы должны будут быть полностью определены. Пользователь не может работать с не завершённым классом, если аргумент требует таковой. Пользователь обязан предоставить именно не завершённый тип, если аргумент шаблона сам является шаблоном, причём сигнатура тоже должна подходить. Согласись, что компилятор с лёгкостью отличит любые попытки подсунуть не то, что ожидается. Теперь blah_blah может использовать X как шаблон, подставляя вместо T любые другие типы, вместо X любые другие шаблоны со строго одним аргументом-типом, передавать им T или не T... в общем пользоваться незавершённостью по полной программе, если оно надо, и при этом позволяя пользователю конкретизировать второй параметр по его желанию.
              Сообщение отредактировано: Qraizer -
                Цитата korvin @
                и получит жопу

                А разве шаблоны нельзя ограничивать конкретным(и) классом(и)?
                ExpandedWrap disabled
                    TMyClass = class
                    public
                      procedure Foo;
                      procedure Bar;
                    end;
                   
                    TSomeClass<T: TMyClass> = class
                      ...
                    end;
                  А зачем?
                  Ну, можно
                  ExpandedWrap disabled
                    template <typename T> class TSomeClass;
                    template <>           class TSomeClass<TMyClass> {
                    /* ... */
                    };
                  Это и есть специалиазция. Полная. Есть ещё частичная.

                  Добавлено
                  Так у вас-таки есть специализации, чикак?
                  Сообщение отредактировано: Qraizer -
                    Цитата D_KEY @
                    Фабрики/фабричные методы гибче и нагляднее

                    Есть пара минусов:
                    - типы необходимо регистрировать заранее.
                    - нет проверки на этапе компиляции, на случай если необходимый тип не зарегистрирован в фабрике.

                    Цитата D_KEY @
                    тем более, что без них все-равно не обойтись в крупном проекте.

                    И в крупных и в мало-мальских, и просто на узких участках, везде не обойтись.

                    Цитата D_KEY @
                    Тут пожалуй, соглашусь, но это можно сделать, если захочется.

                    Я не в курсе, а есть ли возможность при (точнее после) инстанции шаблона класса выполнить свой произвольный код?
                    Т.е. можно ли получить, извиняюсь за тавтологию, аналог классового конструктора класса?

                    Цитата D_KEY @
                    А если ты имел в виду объекты, то такое определение противоречит понятию конструктор. Так что в С++ тут все логично.

                    Чем противоречит? Да мы уже разбирались и выяснили, что и в С++ конструкторы производных классов по сути тоже ничего не конструируют, а просто исполняют код в своём теле.

                    Добавлено
                    Цитата Qraizer @
                    А зачем?

                    Корвин уже наверное объяснял.

                    Цитата Qraizer @
                    Так у вас-таки есть специализации, чикак?

                    Общие ограничения: либо классами, либо рекордами.
                    И специализированные: либо конкретным базовым классом, либо одним или более интерфейсами.

                    Добавлено
                    Цитата korvin @
                    кстати, в Delphi, емнип, тоже есть классы, соответствующие базовым типам (TInteger для Integer и т.п.). или не?

                    Не :)
                    Сообщение отредактировано: DesweR -
                      Цитата MyNameIsIgor @
                      Гммм... Вы полагаете, что я вас попросил посчитать количество слов? :D Я не сомневаюсь, что посчитаете, вы просто код напишите :)

                      нет, я полагаю несколько другое, но может Вы уточните, на что именно мне обратить внимание в том примере?
                        Цитата DesweR @
                        Общие ограничения: либо классами, либо рекордами.
                        И специализированные: либо конкретным базовым классом, либо одним или более интерфейсами.
                        А... Ну это ещё нормально.

                        Добавлено
                        Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"?
                          Цитата Qraizer @
                          Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"?

                          Не так наверное выразился, "либо от конкретного базового класса".
                          Т.е. нет, отсеять ничего не получится, в качестве параметра будет подходить любой производный класс.

                          Добавлено
                          Цитата Qraizer @
                          Гм. Эдак получается, что можно отсеять все классы, просто указав специализацией "производный от TObject"?

                          Гмм... а вообще что спросить то хотел? :D
                            Цитата DesweR @
                            Да мы уже разбирались и выяснили, что и в С++ конструкторы производных классов по сути тоже ничего не конструируют

                            Вы что-то не то выяснили. Перечитайте тему.
                            Цитата korvin @
                            нет, я полагаю несколько другое, но может Вы уточните, на что именно мне обратить внимание в том примере?

                            Вот это же самое на шарпе. Теперь вопрос: почему
                            ExpandedWrap disabled
                                 for(auto w : words)
                                    ++words_count[w];

                            превратилось в
                            ExpandedWrap disabled
                                  foreach(var w in words)
                                    if(words_count.ContainsKey(w))
                                      words_count[w]++;
                                    else
                                      words_count.Add(w, 1);

                            ?

                            Добавлено
                            Цитата Qraizer @
                            Так у вас-таки есть специализации, чикак?

                            У них не специализации. У них ограничения на возможности программиста параметры дженериков.
                            Сообщение отредактировано: MyNameIsIgor -
                              Цитата MyNameIsIgor @
                              Вот это же самое на шарпе. Теперь вопрос: почему
                              ExpandedWrap disabled
                                   for(auto w : words)
                                      ++words_count[w];

                              превратилось в
                              ExpandedWrap disabled
                                    foreach(var w in words)
                                      if(words_count.ContainsKey(w))
                                        words_count[w]++;
                                      else
                                        words_count.Add(w, 1);

                              ?

                              потому что авторы шарпового Dictionary посчитали, что неявное создания пары ключ/значение не нужно? и Вы не смогли это преодолеть?
                                Цитата korvin @
                                и Вы не смогли это преодолеть?

                                Это действительно раздражает :D
                                Цитата korvin @
                                потому что авторы шарпового Dictionary посчитали, что неявное создания пары ключ/значение не нужно?

                                А что бы случилось, если бы они посчитали это нужным? :)
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 342 343 [344] 345 346 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.4908 ]   [ 14 queries used ]   [ Generated: 31.07.26, 09:32 GMT ]