На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 333 334 [335] 336 337 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    То, что ты, korvin, прекрасно подкован в теории, мы давно поняли, как и я понял то, что в практике у тебя пробелы гораздо значительнее, нежели у меня в теории. Зачем мне корневой TObject, если у меня есть шаблоны? Что такого могёт TObject, чего б не смогли шаблоны? И теперь начистоту: что из того, что могут шаблоны, сможет TObject? На кой мне эта радость сдалась?
    Цитата Romkin @
    Как раз у этих конкурентой для метапрограммирования все есть исходно и в языке, просто мозгу, который запорчен примитавами шаблонов и макросов, врубиться в это невозможно, исключения - редкость
    Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор? Не стыдно ещё? Ваши дженерики - вот это от отсутствия препроцессора, да. Если б перед шаблонами ставились аналогичные задачи, их бы в С++ не было за ненадобностью. Ну да, у вас run-time колоритный. Только нафига? У нас то же, только в compile-time. Компилим один раз, а запускаем скомпиленное много. Ваша мина на словах хороша, только вот от её плохой игры блефом за версту несёт.

    Добавлено
    D_KEY, нормально получилось? Ты отомщён?
    Сообщение отредактировано: Qraizer -
      Цитата Qraizer @
      D_KEY, нормально получилось? Ты отомщён?

      Ну там вроде не именно ко мне относилось, но получилось номально :)
        Цитата Qraizer @
        ты, korvin, прекрасно подкован в теории

        ты не прав =)
          Цитата Qraizer @
          Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор?

          Может, потому что шаблоны - это препроцессор ? :)
            А компилятор не препроцессор? wiki: Препроцессор
              Цитата IL_Agent @
              Цитата Qraizer @
              Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор?

              Может, потому что шаблоны - это препроцессор ? :)

              Но ведь шаблоны - это не препроцессор :)
                IL_Agent, препроцессор, говоришь?
                ExpandedWrap disabled
                  // одна библиотека, где-то подлючаемая #include-ом
                  namespace complex
                  {
                  template <typename T>
                  struct complex_number { explicit complex_number(T); /* ... */ };
                   
                  template <typename T>
                  complex_number<T> sqrt(complex_number<T>);
                  } //complex
                   
                  // другая библиотека, подключаемая аналогично и использующая первую
                  template <typename T>
                  T f(T t)
                  {
                    return sqrt(t);
                  }
                   
                  complex::complex_number<float> g()
                  {
                    return f(complex::complex_number<float>(2.0f));
                  }
                   
                  // пользовательский код, сюда библиотки включаются
                  template <typename T>
                  complex::complex_number<T> f(complex::complex_number<T> t)
                  {
                    return t;
                  }
                   
                  template <>
                  complex::complex_number<float> f(complex::complex_number<float> t)
                  {
                    return sqrt(sqrt(t));
                  }
                   
                  complex::complex_number<float> cf1 = g();    // используя вторую библиотку
                  complex::complex_number<float> cf2 = f(cf1); // используя вторую библиотку (для сравнения)
                Скомпилится ли сие, и если да, какая f() будет вызвана?

                Добавлено
                Ещё:
                ExpandedWrap disabled
                  // библиотека
                  template <typename T>
                  void swap(T& l, T& r)
                  {
                    T t = l;
                   
                    l = r;
                    r = t;
                  }
                   
                  void swap(int& l, int& r)
                  {
                    l ^= r;
                    r ^= l;
                    l ^= r;
                  }
                   
                  // пользовательский код
                  template <typename T>
                  void swap_arrays(T **ar1, T **ar2, unsigned int& sz1, unsigned int& sz2)
                  {
                    swap(*ar1, *ar2);
                    swap(sz1, sz2);
                  }
                   
                  void swap(unsigned int& l, unsigned int& r)
                  {
                    swap(reinterpret_cast<int&>(l), reinterpret_cast<int&>(r));
                  }
                   
                  /* где-то тут определения a1, a2, s1 и s2 */
                  /* так понятнее? */
                  void f()
                  {
                    swap_arrays(&a1, &a2, s1, s2);
                  }
                Какие swap() будут вызваны из swap_arrays()?

                Добавлено
                IL_Agent и другие, когда пишешь шаблон, никогда не знаешь, каков будет контекст в точке его использования. Шаблоны прошли 10-летнюю эволюцию для того, чтобы максимально не быть препроцессором. Сайд-эффекты - это очень неприятно.
                Сообщение отредактировано: Qraizer -
                  Цитата Qraizer @
                  IL_Agent, препроцессор, говоришь?

                  Цитата Qraizer @
                  Скомпилится ли сие, и если да, какая f() будет вызвана?

                  Ты выступаешь в защиту шаблонов, написав на них нечитаемый код ?
                  И да, каким образом ответ опровергнет моё утверждение ?
                  Цитата Qraizer @
                  IL_Agent и другие, когда пишешь шаблон, никогда не знаешь, каков будет контекст в точке его использования. Шаблоны прошли 10-летнюю эволюцию для того, чтобы максимально не быть препроцессором. Сайд-эффекты - это очень неприятно.

                  Причём тут контекст, сайд-эффекты и эволюция. Шаблонные классы и функции инстанцируются в с++-код в соответствии с алгоритмом, написанном на языке этих самых шаблонов, вроде как даже тьюринг-полном. Ровно как и php изначально был(а может и есть ?) препоцессором html. И всё это замечательно, но подкачала реализация этого препроцессора. Как только алгоритм препроцессинга мало-мальски усложняется, код становится нечитаемым (см. пример выше).
                  В общем, как ни крути, а с++-шаблоны - это навороченный, многофункциональный, но убогий препроцессор.
                    Цитата IL_Agent @
                    Шаблонные классы и функции инстанцируются в с++-код

                    Гммм... Проблема в том, что шаблоны не инстанцируются в плюсовый код. Они инстанцируются компилятором в его собственные внутренние структуры данных. В AST, если угодно. Вот, например, я могу попросить компилятор осуществить препроцессинг макросов и выдать мне листинг - он это сделает и плевать ему будет что там между макросами, плюсовый ли там вообще код или текст "Войны и мира". Для шаблонов я этого сделать не могу, потому что они не отделимы от остального языка.
                    Цитата IL_Agent @
                    Ты выступаешь в защиту шаблонов, написав на них нечитаемый код ?

                    Правда? А почему я его легко читаю?
                      Цитата IL_Agent @
                      И да, каким образом ответ опровергнет моё утверждение ?

                      Таким, что показывает тот факт, что шаблоны являются частью остального языка.
                      Вот еще более простой пример, раз тот осилить не пожелал:
                      ExpandedWrap disabled
                        template<typename T>
                        void f(T x, T y);
                         
                        void f(int x, int y);
                         
                        //...
                         
                        f(10, 20);
                        f(10.0, 20.0);
                        f("aaa", "bbb");
                        //...
                        IL_Agent, ты даже не понял, что речь идёт о связывании имён, что ли? Ну сорри, объяснить, конечно, смогу, но не буду. Писанины много. Кто работал с препроцессором, знает, что такое side effect, а кто работает с шаблонами, знает, что там напороться на side effect в общем-то реально, только сильно постаравшись, и то большей частью путём откровенных хаков.
                        Код вполне читаемый. Вынеси верхние определия в библиотеку, нижние - в пользовательский код, использующий эту библиотеку. Нужно сделать так, чтобы нейтрализовать случайные влияния контекста в точке использования на библиотечный код, например, случайное нахождение там функции swap(unsigned int&) к библиотеке никак не относящейся, но в то же время разрешить в той же точке использования пользователю донастраивать библиотечный код, например, предоставив для f<>(), если таковая будет вызвана с complex::complex_number, реализацию так ей необходимой sqrt() (притом, что никаких импортов из пространств имён не делается). Поставь себя на место компилятора и попробуй решить эти две диаметрально противоположные задачи. Потом позволь пользователям специализировать библиотечные шаблонные сущности для его классов, если в том возникнет необходимость, и попробуй сформулировать правила отбора той или иной специализации опять же вкупе с правилами связывания имён и недопущения side effects. Когда голова начнёт лопаться, перепрочти первый абзац, и никогда больше не пробуй сравнивать шаблоны с джене тьфу ты... с препроцессором.
                          Цитата MyNameIsIgor @
                          Для шаблонов я этого сделать не могу, потому что они не отделимы от остального языка.

                          Потому что нет такой фичи ;)
                          Цитата D_KEY @
                          Вот еще более простой пример, раз тот осилить не пожелал:

                          Для интов будет использована нешаблонная функция, а для остальных - шаблонная, наверное. И ? Препоцессор, увидев инстанцирование, создав две функции для этих типов.
                            Цитата IL_Agent @
                            В общем, как ни крути, а с++-шаблоны - это навороченный, многофункциональный, но убогий препроцессор.
                            Утверждение человека, не разобравшегося в вопросе. А потому не понимающего, что шаблоны это не надязыковая надстройка, как препроцессор. Объявление шаблона абсолютно равноправная синтаксическая кострукция, подчиняющаяся тем же правилам, что и любая другая. Для них действуют такие же правила перекрытия, перезагрузки и пределы видимости в пространстве имён, как для аналогичной нешаблонной кострукции, что тебе показал в примере Qraizer, но ты не понял даже что конкретно он тебе показал. Шаблоны не существуют обособленно от всего остального С++, как препроцессор. Это такая же часть функционала языка, как, допустим, наличие классов.
                              Дополнил и чуток покоментил примеры выше. Сорри, что не сделал сразу, домашние торопили кину показывать.
                                Qraizer, ты, видимо, считаешь, что если препоцессор, то значит - крайне примитивное. Несколькими постами ранее была ссылка на вики. Так вот, там макросы лиспа приводятся в качестве примера препроцессора. Только там они пишутся на том же языке, что и код, в который они разворачиваются.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 333 334 [335] 336 337 ...  494 495


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