Twisting the RTTI System for Safe Dynamic Casts of void* in C++ | Dr Dobb's Journal. Шаблонная магия, метафункция IsValidExpression / C++ Доброго времени суток, уважаемое Хабрасообщество. Сегодня я хочу поделиться одним интересным приемом, который позволяет определять компилируемость любого конкретного выражения. Пример: /* Определяем метафункцию HasF, которая позволяет определить наличие функции f() у любого класса. */ DECLARE_IS_VALID_EXPRESSION( HasF, ( ( U * ) NULL )->f() /* Это выражение компилируемо только если присутствует U::f() */ ); struct Foo{ void f(); }; struct Bar{}; BOOST_STATIC_ASSERT( HasF< A >::value ); /* Тут константа HasF< A >::value будет true */ BOOST_STATIC_ASSERT( ! HasF< B >::value ); /* Тут константа HasF< A >::value будет false */ Как Вы уже, наверное, догадались мы будем думать как написать макрос DECLARE_IS_VALID_EXPRESSION. Релизация Для этого мы будем использовать принцип SFINAE (substitution failure is not an error).
Именно так работает следующий код: Данная реализация, к сожалению, требует наличия C++0x (мой компилятор — VC10). Применение За сим я прощаюсь, всем спасибо за внимание! Время выполнения операций в C++ под Linux / C++ Доброго времени суток, Хабраюзер. Сегодня речь пойдёт об использовании clock_gettime в качестве секундомера для определения времени выполнения разных участков Вашего кода. Если Вы всё это уже знаете, или предпочитаете использовать gprof или другой профайлер, то смело можете пропускать данный топик, если же Вас это заинтересовало — добро пожаловать под хабракат. Возможно, многим из Вас эта тема будет не интересна в связи с тем, что Вы уже всё это давно знаете. А может просто предпочитаете профайлинг. Может Вы знаете более эффективный способ, и если так, то буду рад услышать Ваши комментарии. Однажды, во время написания очередного теста, понял что простого вывода времени этапа тестирования мне недостаточно и решил написать небольшой класс. Clock_gettime. Данная функция описана в <time.h> и имеет следующий синтаксис: int clock_gettime(clockid_t clock_id, struct timespec *tp); Функция изменяет значения полей в структуре tp, на текущие показатели часов.
Класс GetWorkTime Тесты. Объективные недостатки С++ / C++ Публикуется в рамках недели ненависти к С++ на хабре. Если вам все это еще не надоело, то добро пожаловать под кат. Ранее уже были перечислены глупые причины для ненависти, поэтому я остановлюсь на реальных. Итак, за что же действительно стоит ненавидеть С++. Причина первая, самая серьезная — грамматика. Язык С++ описывается контекстно зависимой грамматикой, следовательно алгоритм его разбора имеет высокую сложность. Template<bool Cond, typename A, typename B> struct Select; ... Красиво, правда? Вторая причина, тоже очень неприятная — отсутствие модулей. Третья причина — шаблоны. SomeType<int> x; компилятор инстанциирует шаблон, создает новый тип. Boost::tuple<int, long, std::string> myTuple; — компилятор инстанциирует как минимум 4 новых типа, так как тип myTyple — это мета-программа, которая рекурсивно вычисляет тип кортежа. В недалеком будущем, благодаря проекту Clang, эта проблема может потерять актуальность.
Причина четвертая — сообщения об ошибках. Www.fefe.de/c++/c%2B%2B-talk.pdf. О ненависти к С++ / C++ Or not , или Java/Python/Ruby? Как часто вы задаёте или слышите подобные вопросы? Не хотелось бы поднимать очередной холивар — по моему мнению, умные люди давно должны были бы прийти к выводу, что при выборе языка нет той серебряной пули, которая бы поставила окончательную точку, — у каждого языка есть свои плюсы и минусы и чаще всего проблемы в прокладке между клавиатурой и стулом.
Я сам программирую на , поскольку решаемые задачи требуют достаточно хорошей скорости обработки данных. На одном из тематических блогов встретил эмоциональную статью в защиту . Взял на себя смелость перевести статью и пару комментариев к ней. Но прежде чем читать, посмотрите, пожалуйста, на прекрасную карту языка С++ (The C++ Lands). У меня представился случай прочитать на сайте TechRepublic интересную. хорошо написанную, но совершенно неточную и провокационную статью.
Не буду вдаваться в детали — если вам интересно, то оригинал можно найти по ссылке. Можно считать, что дни сочтены. B cнова — фигня все это. A skeptic's history of C++ | Programming and Development | TechRepublic.com. Как безопасно разрушить объект. И другие мысли / C++ Недавно разглядывал вакансии одной известной конторы, задумывался над вопросам (которые, кстати, на всех их вакансиях одинаковые). И решил написать заметку по самому интересному (на мой взгляд) аспекту первого же вопроса. Может быть доберусь и до других, а пока предлагаю задуматься, надо ли делать деструкторы виртуальными? Ответ не так уж однозначен, и чтобы заманить вас под кат скажу, что в реализации STL вы обнаружите всего несколько виртуальных деструкторов. Каким же должен быть полный ответ на вопрос про деструкторы? Суть проблемы для тех, кто не очень в курсе Итак, привожу, всем уже надоевший пример, представляющий неправильный деструктор: Результат таков: То есть, конструктор B в строке 16 честно вызвал оба конструктора (A и B), а деструктор в строке 17 вызвал только деструктор класса A, что полностью согласуется с типом переданной ему ссылки.
Всё отработало правильно, но деструктор B вызван не был, что могло привести к утечкам памяти, дескрипторов и других полезных ресурсов. Еще 5++ причин ненавидеть С++ / C++ Признаюсь Вам — я ненавижу язык С++. Он просто выводит меня из себя. Когда я встречаю эти три символа в заголовках статей на любимых ресурсах — еще терпимо, когда вижу в подопытном проекте файлы с расширением .cc и .cpp, .hh и .hpp (и еще .hxx и .cxx, у-ух, тысяча чертей!) — уже злюсь, а уж когда приходится читать, или, еще хуже, писать на нем — да я почти что истекаю ядом! Что ж, попробую заронить и в Вас искру священной ненависти. 0. С — это Вам не С с плюсами!
Ненавижу, когда код на чистом С, который сами Патриархи Керниган и Ритчи признали бы созвучным их Светлому Языку, кощунственно обзывают «С++» и бездумно заключают в файлы с одним из вышеуказанных нечестивых расширений, и, что самое страшное, и компилируют тоже как С++. 1. Это более чем весомая причина для ненависти. Какой удивительный бред! Не стоит и говорить, что в таком же стиле любят воспитывать будущих программистов высшие учебные заведения. «Новые» возможности С++ разлагают неокрепшие умы юных программистов. 2. Шаблоны(!)