На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (33) « Первая ... 14 15 [16] 17 18 ...  32 33  ( Перейти к последнему сообщению )  
> trait + impl vs class , навеяно Rust'ом
    Цитата D_KEY @
    С данной задачей справляются и более слабые языки
    Да. Но задача все же выеденного яйца не стоит. Очень уж исскуственная.
      Цитата applegame @
      Цитата D_KEY @
      С данной задачей справляются и более слабые языки
      Да. Но задача все же выеденного яйца не стоит. Очень уж исскуственная.

      Ну это просто пример. В принципе, тут можно обеспечить более крутые проверки.

      А суть в том, что в C++ нет настоящего параметрического полиморфизма, лишь имитация посредством шаблонов(да, они во многом позволяют делать более крутые вещи, чем дженерики или полиморфные типы).
        Цитата D_KEY @
        А суть в том, что в C++ нет настоящего параметрического полиморфизма
        Как мы уже выяснили, это зависит от того, что понимать под понятием ПП. Я, лично считаю, что это самый что ни на есть настоящий параметрический полиморфизм.

        Добавлено
        Цитата D_KEY @
        Ну это просто пример. В принципе, тут можно обеспечить более крутые проверки.
        Тут только одно ограничение - рекурсивное инстанцирование. на этом более крутые проверки заканчиваются.
        Сообщение отредактировано: applegame -
          Цитата applegame @
          Как мы уже выяснили, это зависит от того, что понимать под понятием ПП. Я, лично считаю, что это самый что ни на есть настоящий параметрический полиморфизм.

          А почему ты так считаешь? Я считаю, что нет, т.к. все портит специализация и перегрузка, которая делает код обобщенной функции/класса зависимым от типов-параметров, что прямо противоречит определению ПП

          Добавлено
          Цитата applegame @
          Тут только одно ограничение - рекурсивное инстанцирование.

          Источник проблемы вообще в том, что нужно инстанцировать. А корень требования инстанцирования в том, что есть зависимость шаблонного кода от параметров(чего нет в случае ПП).
            Цитата D_KEY @
            Я считаю, что нет, т.к. все портит специализация и перегрузка,
            А я не считаю, что портит. Ты же не обязан специализировать и перегружать. Не пурегружай и не специализируй и будет тебе ПП. А то у тебя получается, что автомобиль с крыльями - уже не автомобиль, потому что крылья позволяют летать, а автомобиль по определению не летает.
            Цитата D_KEY @
            Источник проблемы вообще в том, что нужно инстанцировать. А корень требования инстанцирования в том, что есть зависимость шаблонного кода от параметров(чего нет в случае ПП).
            Это ничего не меняет. По сути все равно как там разворачиваются шаблоны внутри, пока дело не доходит до рекурсии. И, по моему глубокому убеждению это никак не связано с "истинностью" ПП. Вооще никак. Это просто недостаток C++.
            Сообщение отредактировано: applegame -
              Цитата applegame @
              А я не считаю, что портит. Ты же не обязан специализировать и перегружать. Не пурегружай и не специализируй и будет тебе ПП.

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

              Цитата
              А то у тебя получается, что автомобиль с крыльями - уже не автомобиль, потому что крылья позволяют летать, а автомобиль по определению не летает.

              Если крылья мешают ездить, то да, это не автомобиль.
                Цитата D_KEY @
                Надо таки посмотреть, что rust скажет по этому поводу.
                Ничего не скажет - не получится там это реализовать.
                ExpandedWrap disabled
                  enum List {
                      Cons(u32, Box<List>),
                      Nil,
                  }

                Значения внутри enum считаются именно значениями, а не типами, так что специализацию для них (пока?) сделать не получится. А если делать реализацию для ScalarProduct, то и проверки длины придётся делать руками. Например, как это сделано тут.
                Сообщение отредактировано: DarkEld3r -
                  Цитата DarkEld3r @
                  Значения внутри enum считаются именно значениями, а не типами, так что специализацию для них (пока?) сделать не получится.

                  Но можно же сделать разные типы для Nil и Cons.
                    Цитата D_KEY @
                    Не будет, так как компилятор будет инстанцировать и зависимость никуда не уйдет.
                    А тебе то какое дело до того что там делает компилятор? Ты смотри на исходники.
                    Цитата D_KEY @
                    Если крылья мешают ездить, то да, это не автомобиль.
                    Тебе мешает специализация и перегрузка?
                      Цитата applegame @
                      Цитата D_KEY @
                      Не будет, так как компилятор будет инстанцировать и зависимость никуда не уйдет.
                      А тебе то какое дело до того что там делает компилятор?

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

                      Цитата
                      Цитата D_KEY @
                      Если крылья мешают ездить, то да, это не автомобиль.
                      Тебе мешает специализация и перегрузка?

                      Она мне помогает :D Но ПП она мешает, да.
                        Цитата D_KEY @
                        А в случае с шаблонами - нет. Мне нужно знать, что зависит от параметра шаблона, а что нет, подхватит ли он нужные мне перегрузки и специализации или нет. И т.д.
                        Полагаю это твои личные заморочки. Я начинаю задумываться о глубинах компилятора, только когда что-то оптимизирую или пишу нечто не укладывающееся в ПП. Может этому способствует более приятный синтаксис D, не знаю.
                        Сообщение отредактировано: applegame -
                          Цитата applegame @
                          Цитата D_KEY @
                          А в случае с шаблонами - нет. Мне нужно знать, что зависит от параметра шаблона, а что нет, подхватит ли он нужные мне перегрузки и специализации или нет. И т.д.
                          Полагаю это твои личные заморочки.

                          Вообще-то это нужно знать, чтобы решать задачи. Просто ты, как правило, итак это держишь в голове, потому отдельно не обдумываешь. Но тебе нужно знать, что
                          ExpandedWrap disabled
                            template<typename T>
                            void foo(T x)
                            {
                                bar(x);
                            }


                          Вызовет подходящий bar. А в более сложных случаях(методы, неймспейсы и поиск Кенига, перегрузки, специализации и пр. и пр.), это не так просто понять.
                            Цитата D_KEY @
                            Но можно же сделать разные типы для Nil и Cons.
                            Как? Вот тут список - это или конец списка или значение и указатель на список:
                            ExpandedWrap disabled
                              enum List {
                                  Cons(u32, Box<List>),
                                  Nil,
                              }
                            Если сделать отдельно:
                            ExpandedWrap disabled
                              struct Nil;
                              struct Cons(u32, Box<???>);
                            То что должно быть вместо вопросительных знаков? Да и матчиться по разнородным типам нельзя.

                            В общем, или я туплю где-то или всё-таки не получится.
                              Цитата DarkEld3r @
                              Цитата D_KEY @
                              Но можно же сделать разные типы для Nil и Cons.
                              Как? Вот тут список - это или конец списка или значение и указатель на список:
                              ExpandedWrap disabled
                                enum List {
                                    Cons(u32, Box<List>),
                                    Nil,
                                }
                              Если сделать отдельно:
                              ExpandedWrap disabled
                                struct Nil;
                                struct Cons(u32, Box<???>);
                              То что должно быть вместо вопросительных знаков? Да и матчиться по разнородным типам нельзя.

                              В общем, или я туплю где-то или всё-таки не получится.

                              Там в ЖЖ код на C#, на дженериках.
                              ExpandedWrap disabled
                                using System;
                                interface ScalarProduct<A> {
                                  int scalarProduct(A second);
                                }
                                class Nil : ScalarProduct<Nil> {
                                  public Nil(){}
                                  public int scalarProduct(Nil second) {
                                    return 0;
                                  }
                                }
                                class Cons<A> : ScalarProduct<Cons<A>> where A : ScalarProduct<A> {
                                  public int value;
                                  public A tail;
                                  public Cons(int _value, A _tail) {
                                    value = _value;
                                    tail = _tail;
                                  }
                                  public int scalarProduct(Cons<A> second){
                                    return value * second.value + tail.scalarProduct(second.tail);
                                  }
                                }
                                class _Test{
                                  public static int main(int n){
                                    return _main(n, 0, new Nil(), new Nil());
                                  }
                                  public static int _main<A>(int n, int i, A first, A second) where A : ScalarProduct<A> {
                                    if (n == 0) {
                                      return first.scalarProduct(second);
                                    } else {
                                      return _main(n-1, i+1, new Cons<A>(2*i+1,first), new Cons<A>(i*i, second)); // Works
                                      //return _main(n-1, i+1, first, new Cons<A>(i*i, second)); // Doesn't work
                                    }
                                  }
                                }
                                public class Test{
                                  public static void Main(){
                                    Console.Write("Enter a number: ");
                                    int val = Convert.ToInt32(Console.ReadLine());
                                    Console.WriteLine(_Test.main(val));
                                  }
                                }
                                Цитата D_KEY @
                                Но тебе нужно знать, что
                                ExpandedWrap disabled
                                  template<typename T>
                                  void foo(T x)
                                  {
                                      bar(x);
                                  }


                                Вызовет подходящий bar.
                                Нет не нужно. Этот bar вообще может быть в сторонней либе, и мне по сути совершенно все равно, как оно там реализовано: перегрузкой, просто шаблоном или шаблоном с частичной специализацией. Для меня это будет полиморфная функция bar.

                                Добавлено
                                Тут вот еще Qraizer задавал вопрос, мне тоже интересно. Что значит полиморфный тип? Кто-нибудь может дать внятное определение, на основании которого можно было бы утверждать, что T в шаблоне - это не полиморфный тип.
                                Сообщение отредактировано: applegame -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (33) « Первая ... 14 15 [16] 17 18 ...  32 33


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0558 ]   [ 14 queries used ]   [ Generated: 17.05.24, 05:27 GMT ]