Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 333 334 [335] 336 337 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5011
,
|
|
|
|
То, что ты, korvin, прекрасно подкован в теории, мы давно поняли, как и я понял то, что в практике у тебя пробелы гораздо значительнее, нежели у меня в теории. Зачем мне корневой TObject, если у меня есть шаблоны? Что такого могёт TObject, чего б не смогли шаблоны? И теперь начистоту: что из того, что могут шаблоны, сможет TObject? На кой мне эта радость сдалась?
Цитата Romkin @ Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор? Не стыдно ещё? Ваши дженерики - вот это от отсутствия препроцессора, да. Если б перед шаблонами ставились аналогичные задачи, их бы в С++ не было за ненадобностью. Ну да, у вас run-time колоритный. Только нафига? У нас то же, только в compile-time. Компилим один раз, а запускаем скомпиленное много. Ваша мина на словах хороша, только вот от её плохой игры блефом за версту несёт. Как раз у этих конкурентой для метапрограммирования все есть исходно и в языке, просто мозгу, который запорчен примитавами шаблонов и макросов, врубиться в это невозможно, исключения - редкость Добавлено D_KEY, нормально получилось? Ты отомщён? |
|
Сообщ.
#5012
,
|
|
|
|
Цитата Qraizer @ D_KEY, нормально получилось? Ты отомщён? Ну там вроде не именно ко мне относилось, но получилось номально |
|
Сообщ.
#5013
,
|
|
|
|
Цитата Qraizer @ ты, korvin, прекрасно подкован в теории ты не прав =) |
|
Сообщ.
#5014
,
|
|
|
|
Цитата Qraizer @ Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор? Может, потому что шаблоны - это препроцессор ? |
|
Сообщ.
#5015
,
|
|
|
|
А компилятор не препроцессор? wiki: Препроцессор
|
|
Сообщ.
#5016
,
|
|
|
|
Цитата IL_Agent @ Цитата Qraizer @ Уважаемый гуру всё ещё продолжает путать шаблоны и препроцессор? Может, потому что шаблоны - это препроцессор ? ![]() Но ведь шаблоны - это не препроцессор |
|
Сообщ.
#5017
,
|
|
|
|
IL_Agent, препроцессор, говоришь?
![]() ![]() // одна библиотека, где-то подлючаемая #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); // используя вторую библиотку (для сравнения) Добавлено Ещё: ![]() ![]() // библиотека 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); } Добавлено IL_Agent и другие, когда пишешь шаблон, никогда не знаешь, каков будет контекст в точке его использования. Шаблоны прошли 10-летнюю эволюцию для того, чтобы максимально не быть препроцессором. Сайд-эффекты - это очень неприятно. |
|
Сообщ.
#5018
,
|
|
|
|
Цитата Qraizer @ IL_Agent, препроцессор, говоришь? Цитата Qraizer @ Скомпилится ли сие, и если да, какая f() будет вызвана? Ты выступаешь в защиту шаблонов, написав на них нечитаемый код ? И да, каким образом ответ опровергнет моё утверждение ? Цитата Qraizer @ IL_Agent и другие, когда пишешь шаблон, никогда не знаешь, каков будет контекст в точке его использования. Шаблоны прошли 10-летнюю эволюцию для того, чтобы максимально не быть препроцессором. Сайд-эффекты - это очень неприятно. Причём тут контекст, сайд-эффекты и эволюция. Шаблонные классы и функции инстанцируются в с++-код в соответствии с алгоритмом, написанном на языке этих самых шаблонов, вроде как даже тьюринг-полном. Ровно как и php изначально был(а может и есть ?) препоцессором html. И всё это замечательно, но подкачала реализация этого препроцессора. Как только алгоритм препроцессинга мало-мальски усложняется, код становится нечитаемым (см. пример выше). В общем, как ни крути, а с++-шаблоны - это навороченный, многофункциональный, но убогий препроцессор. |
|
Сообщ.
#5019
,
|
|
|
|
Цитата IL_Agent @ Шаблонные классы и функции инстанцируются в с++-код Гммм... Проблема в том, что шаблоны не инстанцируются в плюсовый код. Они инстанцируются компилятором в его собственные внутренние структуры данных. В AST, если угодно. Вот, например, я могу попросить компилятор осуществить препроцессинг макросов и выдать мне листинг - он это сделает и плевать ему будет что там между макросами, плюсовый ли там вообще код или текст "Войны и мира". Для шаблонов я этого сделать не могу, потому что они не отделимы от остального языка. Цитата IL_Agent @ Ты выступаешь в защиту шаблонов, написав на них нечитаемый код ? Правда? А почему я его легко читаю? |
|
Сообщ.
#5020
,
|
|
|
|
Цитата IL_Agent @ И да, каким образом ответ опровергнет моё утверждение ? Таким, что показывает тот факт, что шаблоны являются частью остального языка. Вот еще более простой пример, раз тот осилить не пожелал: ![]() ![]() 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"); //... |
|
Сообщ.
#5021
,
|
|
|
|
IL_Agent, ты даже не понял, что речь идёт о связывании имён, что ли? Ну сорри, объяснить, конечно, смогу, но не буду. Писанины много. Кто работал с препроцессором, знает, что такое side effect, а кто работает с шаблонами, знает, что там напороться на side effect в общем-то реально, только сильно постаравшись, и то большей частью путём откровенных хаков.
Код вполне читаемый. Вынеси верхние определия в библиотеку, нижние - в пользовательский код, использующий эту библиотеку. Нужно сделать так, чтобы нейтрализовать случайные влияния контекста в точке использования на библиотечный код, например, случайное нахождение там функции swap(unsigned int&) к библиотеке никак не относящейся, но в то же время разрешить в той же точке использования пользователю донастраивать библиотечный код, например, предоставив для f<>(), если таковая будет вызвана с complex::complex_number, реализацию так ей необходимой sqrt() (притом, что никаких импортов из пространств имён не делается). Поставь себя на место компилятора и попробуй решить эти две диаметрально противоположные задачи. Потом позволь пользователям специализировать библиотечные шаблонные сущности для его классов, если в том возникнет необходимость, и попробуй сформулировать правила отбора той или иной специализации опять же вкупе с правилами связывания имён и недопущения side effects. Когда голова начнёт лопаться, перепрочти первый абзац, и никогда больше не пробуй сравнивать шаблоны с |
|
Сообщ.
#5022
,
|
|
|
|
Цитата MyNameIsIgor @ Для шаблонов я этого сделать не могу, потому что они не отделимы от остального языка. Потому что нет такой фичи ![]() Цитата D_KEY @ Вот еще более простой пример, раз тот осилить не пожелал: Для интов будет использована нешаблонная функция, а для остальных - шаблонная, наверное. И ? Препоцессор, увидев инстанцирование, создав две функции для этих типов. |
|
Сообщ.
#5023
,
|
|
|
|
Цитата IL_Agent @ Утверждение человека, не разобравшегося в вопросе. А потому не понимающего, что шаблоны это не надязыковая надстройка, как препроцессор. Объявление шаблона абсолютно равноправная синтаксическая кострукция, подчиняющаяся тем же правилам, что и любая другая. Для них действуют такие же правила перекрытия, перезагрузки и пределы видимости в пространстве имён, как для аналогичной нешаблонной кострукции, что тебе показал в примере Qraizer, но ты не понял даже что конкретно он тебе показал. Шаблоны не существуют обособленно от всего остального С++, как препроцессор. Это такая же часть функционала языка, как, допустим, наличие классов. В общем, как ни крути, а с++-шаблоны - это навороченный, многофункциональный, но убогий препроцессор. |
|
Сообщ.
#5024
,
|
|
|
|
Дополнил и чуток покоментил примеры выше. Сорри, что не сделал сразу, домашние торопили кину показывать.
|
|
Сообщ.
#5025
,
|
|
|
|
Qraizer, ты, видимо, считаешь, что если препоцессор, то значит - крайне примитивное. Несколькими постами ранее была ссылка на вики. Так вот, там макросы лиспа приводятся в качестве примера препроцессора. Только там они пишутся на том же языке, что и код, в который они разворачиваются.
|