Вот такой интересный вопрос.
Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,
и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
Желательно в клонах винды.
29.05.08 11:29: Перенесено модератором из 'Прочее' — Хитрик Денис
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Я, например, когда то давно придумал прятать от пользователей моих библиотек под void* все что мне надо. То есть экспортируется из библиотеки класс с какими-то методами, а поля класса я не хочу показывать пользовтаелю, вот и прячу их под void* — что-то типа HWND
Может криво кончно, но я ничего больше не придумал
Здравствуйте, Anpek, Вы писали:
A>Здравствуйте, LaptevVV, Вы писали:
A>Я, например, когда то давно придумал прятать от пользователей моих библиотек под void* все что мне надо. То есть экспортируется из библиотеки класс с какими-то методами, а поля класса я не хочу показывать пользовтаелю, вот и прячу их под void* — что-то типа HWND
A>Может криво кончно, но я ничего больше не придумал
Здравствуйте, LaptevVV, Вы писали:
LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя, LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
Здравствуйте, Кодт, Вы писали:
LVV>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя, LVV>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
К>В голом си? Всякие там qsort, например...
Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста.
Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++.
Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
К>>В голом си? Всякие там qsort, например... LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста. LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++. LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?
Дело не в ограничениях по памяти.
1. Есть embedding и binding C++ного кода с различными чужеродными рантаймами. С питоном там всяким... да даже с WinAPI.
Попытка написать на С++ callback-функцию для передачи наружу, или наоборот, интерфейс, принимающий callback-функцию извне, — так или иначе выведет на использование обезличенных аргументов.
Тут есть 3 варианта:
— честно объявить, что тип аргумента — intptr_t
— void* и void const* — здесь мы сами себе накладываем доп.ограничения, а заодно снимаем искушение пользоваться арифметикой (intptr_t — это всё-таки целое)
— именованные типы хэндлов, двоично совместимые с void*/intptr_t
Что о нас подумает противоположная сторона — нам пофиг, хотя бы потому, что наружу мы выставляем тоже обезличенный интерфейс (extern "C"), который приводится к тамошней системе типов. Скажем, в VB все винапишные заголовки вместо HWND используют LongInt.
2. Полиморфизм в С++ делается 3 способами:
— интрузивно, в духе ООП (на виртуальных функциях)
— неинтрузивно, на хэндлах и колбеках
— опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать.
Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns".
И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си).
Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное".
3. Программист может всю жизнь пребывать в узких рамках того фреймворка, с которым он привык иметь дело. Дали ему COM — будет всё на COM. Дали boost::function — тоже довлеет.
Зачем знать обо всяких низкоуровневых штуках?
Во-первых, для кругозора.
Во-вторых, чтоб не быть внезапно ошарашенным, когда наткнётся на void* или strcpy в чьих-то исходниках.
Покуда в С++ есть доступ к подвалу, знать об устройстве подвала полезно.
Другое дело, что одним лишь подвалом исчерпывать учебник нельзя.
Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...
Здравствуйте, Кодт, Вы писали:
К>Дело не в ограничениях по памяти. К>1. Есть embedding и binding C++ного кода с различными чужеродными рантаймами. С питоном там всяким... да даже с WinAPI. К>Попытка написать на С++ callback-функцию для передачи наружу, или наоборот, интерфейс, принимающий callback-функцию извне, — так или иначе выведет на использование обезличенных аргументов. К>Тут есть 3 варианта: К>- честно объявить, что тип аргумента — intptr_t К>- void* и void const* — здесь мы сами себе накладываем доп.ограничения, а заодно снимаем искушение пользоваться арифметикой (intptr_t — это всё-таки целое) К>- именованные типы хэндлов, двоично совместимые с void*/intptr_t
К>Что о нас подумает противоположная сторона — нам пофиг, хотя бы потому, что наружу мы выставляем тоже обезличенный интерфейс (extern "C"), который приводится к тамошней системе типов. Скажем, в VB все винапишные заголовки вместо HWND используют LongInt.
Итак, первое — использование С++ в "чужих" системах. Когда либо нельзя написать на родном языке, либо это будет очень медленно.
Хотя даже и в родных "водах" типа WinAPI — тоже. Посмотрю внимательно в эту сторону.
К>2. Полиморфизм в С++ делается 3 способами: К>- интрузивно, в духе ООП (на виртуальных функциях) К>- неинтрузивно, на хэндлах и колбеках К>- опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать. К>Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns". К>И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си). К>Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное".
Вот пункт 2 как раз и вызывает отторжение... Считает, что в учебном пособии не место о таком старом подходе рассказывать.
К>3. Программист может всю жизнь пребывать в узких рамках того фреймворка, с которым он привык иметь дело. Дали ему COM — будет всё на COM. Дали boost::function — тоже довлеет. К>Зачем знать обо всяких низкоуровневых штуках? К>Во-первых, для кругозора. К>Во-вторых, чтоб не быть внезапно ошарашенным, когда наткнётся на void* или strcpy в чьих-то исходниках. К>Покуда в С++ есть доступ к подвалу, знать об устройстве подвала полезно. К>Другое дело, что одним лишь подвалом исчерпывать учебник нельзя.
Вот за напоминание о COM — спасибо. Там жеж как раз все через указатели и делается... К>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...
Эта книжка будет потолще книжки Бертрана Мейера...
Если писать не поверхностно, а всерьез...
Думаю, если всерьез писать, то по каждой теме можно накатать объем типа новых Компиляторов...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, LaptevVV, Вы писали:
К>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам...
ммм "... дык ктожь ему дасть... " (с)
IMHO это будет странная помесь фундаментальщины с прикладным закидоном.
Логичнее было бы построить курс "C++ applied" в котором бы объяснялись прикладные вещи с упором на технику применения конкретного языка.
Естественно курс должен идти параллельно с "computer Science" тогда, по моему, практика подтверждала бы теорию.
Здравствуйте, LaptevVV, Вы писали:
К>>2. Полиморфизм в С++ делается 3 способами: К>>- интрузивно, в духе ООП (на виртуальных функциях) К>>- неинтрузивно, на хэндлах и колбеках К>>- опять же неинтрузивно, на замыканиях (boost::function); замыкания времени компиляции — std::bind1st, boost::bind — не будем рассматривать. К>>Очевидно, что неинтрузивный полиморфизм можно в открытую реализовать через интрузивный — даже была статья такая "Kingdom of Nouns". К>>И наоборот, кстати (самый доступный пример — код, который рожает midl для голого си). К>>Но нужно же понимать, как это устроено. Чтоб, при случае, самому хотя бы отлаживать, не говорю уже о "написать подобное". LVV>Вот пункт 2 как раз и вызывает отторжение... Считает, что в учебном пособии не место о таком старом подходе рассказывать.
Что она называет "старым подходом"?
Есть две (парадигмы) — мир объектов и мир функций, интрузивные и неинтрузивные политики чего бы то ни было.
Полиморфизм в стиле ООП — пресловутое Королевство Имён. У этого подхода есть ряд недостатков (прежде всего, синтаксический оверхед, навязанный пользователю).
Полиморфизм в стиле ФП — на С++ на уровне языка по-человечески не поддерживается, приходится сперва спуститься в подвал и реализовать его, а потом уже пользоваться высокоуровневыми строго типизированными средствами. Это тоже оверхед, но уже запиханный внутрь библиотеки.
Если читателю учебника неинтересно устройство boost::function, то можно и не писать об устройстве.
К>>Вообще, интересно было бы взглянуть на учебный курс "C++ с ног до головы", где есть место и strcpy, и математике, и UI, и интеропу, и всяким парсерам-генераторам... LVV>Эта книжка будет потолще книжки Бертрана Мейера... LVV>Если писать не поверхностно, а всерьез... LVV>Думаю, если всерьез писать, то по каждой теме можно накатать объем типа новых Компиляторов...
Вчера нашёл на книжной полке ORLY'вский учебник по Питону. Этим талмудом можно человека убить. И тоже с пониманием, что всё-всё-всё охватить не удалось
Там, правда, четверть книги — это секс с Tk, и ещё четверть — секс с CGI. Можно было бы и подсократить...
Здравствуйте, LaptevVV, Вы писали:
LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя,
ну... STL нельзя использовать там, где не поддерживаются исключения. Например, в драйверописании.
Точнее и там можно, но очень и очень осторожно — по этому поводу даже статья где-то на сайте мелкософта была.
LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
Первый пришедший на ум пример — каноническая реализация COM-овского QueryInterface:
Здравствуйте, LaptevVV, Вы писали:
LVV>Вот такой интересный вопрос. LVV>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя, LVV>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
ну еще как пример — написание внутренностей своего менеджера памяти в виде malloc/free-like функций (только не надо говорить, что стандартный и так очень быстр). Естественно будет использован тип void *. Почему malloc возвращает void*, думаю вы и так знаете.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Кодт, Вы писали:
LVV>>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя, LVV>>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
К>>В голом си? Всякие там qsort, например... LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста. LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++. LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?
1) Низкоуровневые драйвера. В kernel mode — проблематично с памятью и скорость должна быть очень высокой.
2) Программирование микроконтроллеров. Не для всех микроконтроллеров существуют компиляторы реализующие все функции языка, про стандартные библиотеки я вообще молчу.
3) Мобильные девайсы. Возможно сейчас не актуально, но на заре, скажем для Palm`ов, стандартная библиотека C++ в частности, да и поддержка шаблонов в компиляторе вообще, либо не были толком реализованы, либо были реализованы очень плохо, либо приводили к таким накладным расходам по памяти, что пользоваться было нельзя или приходилось использовать очень осторожно и ограниченно (могло даже не компилироваться, потому что бинарь вылезал за пределы сегмента).
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
К>Вчера нашёл на книжной полке ORLY'вский учебник по Питону. Этим талмудом можно человека убить. И тоже с пониманием, что всё-всё-всё охватить не удалось К>Там, правда, четверть книги — это секс с Tk, и ещё четверть — секс с CGI. Можно было бы и подсократить...
Если я правильно понял, что за книга, то она и весит, в англ. издании килограмма 3
Of course, the code must be complete enough to compile and link.
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Кодт, Вы писали:
LVV>>>Знающий народ, назовите темы программирования, где STL и шаблоны использовать нельзя, LVV>>>и приходится изощряться с бестиповыми указателями для написания полиморфной функции.
К>>В голом си? Всякие там qsort, например... LVV>Вот-вот! Об этом и речь. Я тут в Павловской переписываюсь (которая в из-ве Питер книжки по С++ издала) и мы с ней заспорили по поводу использования бестипового указателя. Она считает, что это старье и в книжках про написание полиморфных функций с помощью void* рассказывать не следует (у нее и нет). А я утверждаю, что знание такого приема — важное профессиональное знание программиста. LVV>Хочет, чтоб я привел убедительные примеры реального использования void*. Причем именно в С++. LVV>Мож есть ниши, где ну никак шаблоны и STL из-за ограничения по памяти не проходят?
Убедительные примеры действительно нужны. А также примеры, где так делать не следует. А то вот мою теперешнюю группу научили — и теперь в любом, даже самом что ни на есть объектно-ориентированном коде с STL начинают такие вещи всплывать.