ну типа как пример задачиМальчик-Одуванчик wrote: А нафига, если они уже описаны в стандарте как элементы языка?
причем, которая реализована тупо через define )) (т.е. definом смотрим подо что компилим и подставляем нужную реализацию)
ну типа как пример задачиМальчик-Одуванчик wrote: А нафига, если они уже описаны в стандарте как элементы языка?
ну мож сокращу как-нтьOleg Co wrote:А как-же правило - 2стр. максимум?Alexandr wrote:у меня как раз такое резюмеProsche wrote:мы сейчас ищем людей на C++ и резюме на 5 страниц (коих подавляющее большинство), где описан опыт по C++, PHP, Java, JavaScript, Perl, Excel мacros , SQL... сразу идут в топку.
страницы на 3
А зачем в этом случае вообще париться с pimpl?Prosche wrote:Тут как раз идея связана со второй фишкой пимпла: скрыть имплементацию. Для винды вам нужно хранить в классе, какой нибудь WINDOWS_THREAD_T handle, а для никсов int handle, и пимпл дает возможность это дело в имплементации скрыть, а декларация чистенькая и для обоих имплементаций одинаковая.Alexandr wrote: ну и на кой там pimpl упало? Они потоки под Linux и Windows в runtime переключать решили?
Дефайны, кстати, аццкое зло. И должны применяться в плюсах, только если иначе никак. (например, если вы решите countof через sizeof заимплементить).
Специализировать шаблон типом OS?Мальчик-Одуванчик wrote:А зачем в этом случае вообще париться с pimpl?Prosche wrote:Тут как раз идея связана со второй фишкой пимпла: скрыть имплементацию. Для винды вам нужно хранить в классе, какой нибудь WINDOWS_THREAD_T handle, а для никсов int handle, и пимпл дает возможность это дело в имплементации скрыть, а декларация чистенькая и для обоих имплементаций одинаковая.Alexandr wrote: ну и на кой там pimpl упало? Они потоки под Linux и Windows в runtime переключать решили?
Дефайны, кстати, аццкое зло. И должны применяться в плюсах, только если иначе никак. (например, если вы решите countof через sizeof заимплементить).
На мой взгляд, гораздо эффективнее будет специализация шаблонных классов (или отдельных методов) под это дело.
легко. вот буквально на днях отгрузили первому кастомеру либу, она кроссплатформенная, под все нынешние актуальные платформы, никаких дефайнов, весь платформ специфик код вынесен в отдельные классы, под каждую платформу свой, имплементации которых cmake (он у нас собирает билды на всех платформах) берет в зависимости от таргета (типа linux/thread.cpp, windows/thread.cpp etc).OtherSide wrote:Как вы собрались без дефайнов писать мультиплатформенный код - хз
Стандарты они бывают разные, бывает C++11, а бывает и C++03. Например, приходят сейлз и говорят что они заключили договор лимонов на 20, но у кастомера 10я студия и менять он ничего не будет, а собираться все должно на ней.Мальчик-Одуванчик wrote: А нафига, если они уже описаны в стандарте как элементы языка?
Что-то и я завис.assazello wrote:Только сейчас понял, что потоки - это threads, а не streams.
А как по русски будут streams?
компилятор под линукс сильно удивиться вашей приватной переменной типа WINDOWS_THREAD_T, а значит нужно дефайнами играть, а если у вас под винду 3 переменных таких, а под линукс 18, в привате будет помойка.... не не, пимпл рулитAlexandr wrote: они в любом случае будут в private
Как вариант. Интерфейс же при этом остается неизменным.assazello wrote:Специализировать шаблон типом OS?Мальчик-Одуванчик wrote:А зачем в этом случае вообще париться с pimpl?Prosche wrote:Тут как раз идея связана со второй фишкой пимпла: скрыть имплементацию. Для винды вам нужно хранить в классе, какой нибудь WINDOWS_THREAD_T handle, а для никсов int handle, и пимпл дает возможность это дело в имплементации скрыть, а декларация чистенькая и для обоих имплементаций одинаковая.Alexandr wrote: ну и на кой там pimpl упало? Они потоки под Linux и Windows в runtime переключать решили?
Дефайны, кстати, аццкое зло. И должны применяться в плюсах, только если иначе никак. (например, если вы решите countof через sizeof заимплементить).
На мой взгляд, гораздо эффективнее будет специализация шаблонных классов (или отдельных методов) под это дело.
Streams были потоками ввода-вывода 30-40 лет, если только переопределили последние годы. Threads ето те же processes только легкие введены для быстрого переключения без затрат на полную смену контекстаМальчик-Одуванчик wrote:Что-то и я завис.assazello wrote:Только сейчас понял, что потоки - это threads, а не streams.
А как по русски будут streams?
С одной стороны threads - это нити. Есть же устойчивый жаргон типа "создать нитку"
C другой - потоки, в контексте "многопоточных приложений"
streams - потоки ввода-вывода. Как-то так
What's the English term for "исполняемый поток"?helg wrote:В былые времена мы говорили "поток данных" и "исполняемый поток". Но потом стали использовать "нить" и "поток" - так быстрее.
недостаток pimpl проявляется когда нужно в обычную функцию передать исходный тип (тот, который уж спрятан во внутренностях pimpl).Prosche wrote:легко. вот буквально на днях отгрузили первому кастомеру либу, она кроссплатформенная, под все нынешние актуальные платформы, никаких дефайнов, весь платформ специфик код вынесен в отдельные классы, под каждую платформу свой, имплементации которых cmake (он у нас собирает билды на всех платформах) берет в зависимости от таргета (типа linux/thread.cpp, windows/thread.cpp etc).OtherSide wrote:Как вы собрались без дефайнов писать мультиплатформенный код - хз
Стандарты они бывают разные, бывает C++11, а бывает и C++03. Например, приходят сейлз и говорят что они заключили договор лимонов на 20, но у кастомера 10я студия и менять он ничего не будет, а собираться все должно на ней.Мальчик-Одуванчик wrote: А нафига, если они уже описаны в стандарте как элементы языка?
компилятору удивляться не надо будет, пишите разных 2 класса под разные платформы, но с одинаковым интерфейсом и definом выбираете нужную реализацию, никаких помоек.Prosche wrote:компилятор под линукс сильно удивиться вашей приватной переменной типа WINDOWS_THREAD_T, а значит нужно дефайнами играть, а если у вас под винду 3 переменных таких, а под линукс 18, в привате будет помойка.... не не, пимпл рулитAlexandr wrote: они в любом случае будут в private
Ну если вас устраивает такое:Alexandr wrote:компилятору удивляться не надо будет, пишите разных 2 класса под разные платформы, но с одинаковым интерфейсом и definом выбираете нужную реализацию, никаких помоек.Prosche wrote:компилятор под линукс сильно удивиться вашей приватной переменной типа WINDOWS_THREAD_T, а значит нужно дефайнами играть, а если у вас под винду 3 переменных таких, а под линукс 18, в привате будет помойка.... не не, пимпл рулитAlexandr wrote: они в любом случае будут в private
Pimpl конечно рулит, но совершенно в других контекстах
Code: Select all
#ifdef WINDOWS
class X
{
common API
private:
win_t_1 w1;
win_t_1 w2;
win_t_1 w3;
win_t_1 w4;
win_t_1 w5;
win_t_1 w6;
win_t_1 w7;
win_t_1 w8;
}
#elif LINUX
class X
{
common API
private:
nix_t_1 l1;
nix_t_1 l2;
nix_t_1 l3;
}
#endif
}
Code: Select all
class X
{
common API
private:
class Impl;
Impl* impl_;
}
Первый подход тоже имеет право на жизнь в случае если, конкрентные реализации не экспозиаться наружу, a например factory method возвращает shared_prt на interface за которым ужe стоят конкретные реализации (win or lin), которые клиенту не видны (т.е. прямая альтернатива pimpl).Prosche wrote:вместоCode: Select all
#ifdef WINDOWS class X { common API private: win_t_1 w1; win_t_1 w2; win_t_1 w3; win_t_1 w4; win_t_1 w5; win_t_1 w6; win_t_1 w7; win_t_1 w8; } #elif LINUX class X { common API private: nix_t_1 l1; nix_t_1 l2; nix_t_1 l3; } #endif }
То врядли мы друг друга поймем. Своим подопечным я за такое руки отрываюCode: Select all
class X { common API private: class Impl; Impl* impl_; }
А вы все свои классы через pimpl реализовываете?Prosche wrote:Приобрел я как раз весьма много, я не вытаскиваю наружу ненужное, вы же своими дефайнами "дарите" тому, кто будет использовать ваш API еще и хедеры, где описаны win_t_1 и пр., которые совершенно неизвестно, что там внутри декларируют и дефайнят. Есть богатый опыт разруливания подобных конфликтов, когда хедеры работающие отлично поодиночке начинают сносить крышу компилеру вместе и начинается, а давай поменяем их местами, а давай попробуем #undef max или string. А по поводы производительности, не стоит заниматься преждевременной оптимизацией, к добру это не приводит обычно.
Это к применению Pimpl никакого отношения не имеет, в общем-то.Prosche wrote:Есть богатый опыт разруливания подобных конфликтов, когда хедеры работающие отлично поодиночке начинают сносить крышу компилеру вместе и начинается, а давай поменяем их местами, а давай попробуем #undef max или string.
как-то таг, странно, почему в ядре линукса не применяют pimpl для разных платформ, ведь там тоже можно с h файлами запутатьсяМальчик-Одуванчик wrote:все что нужно - задать таг, описывающий настраиваемый тип оборудования, операционки, или иного настраиваемого ресурса.
На этапе компиляци вполне можно через макросы, параметры компилятора или тупо создавая файлы, специфичные для платформы.
дальше - специализации шаблона.