Вобще говоря язык C++ можно назвать "Век живи - век учись" Вот, сегодня научился специализировать шаблоны классов шаблонами классов ) Код (Text): template<class T> class A { // ... Шаблон. }; template<> class A<int> { // ... Специализация по инту }; template<class T> class A<vector<T> > { // ... Специализация по шаблону!!! :) }; Вот такие пироги. Поделитесь, кто для себя какие открытия делал?
Для меня было открытием, что можно писать через запятую {void * mem, a = func({mem = malloc(1024),memset(mem,0,1024),mem})} а ещё то, что в коде bool f(){return false;}; void main(){ if (f() && somefunc()){}; } somefunc никогда не выполнится
Loger Тут любой "нормальный" оптимизирующий компилятор просто должен заинлайнить f и заметить что условие всегда будет false. Таким образом, весь if можно убрать из кода, что и сделает, например, VC.
Quantum Это не оптимизирующий компилятор, это входит в стандарт C / C++. Тоесть стандарт гарантирует что if(pObject && pObject->IsProperty()) является нормальным кодом и если pObject равен нулю, то далее проверки не пойдут. Это верно для встроенных типов. Если перегрузить логические операции, то проверки будут выполняться полностью. Именно по этому ОЧЕНЬ не рекомендуется перегружать логику. Loger Хмм А какой параметр у func? Первый раз вижу что аргумент можно в фигурные скобки брать?
Насчет извращений в С++ есть книжечка "Современное проэктирование на С++" - автор Александреску. Правда в книге описаны только извращения с шаблонами.
Loki, boost - вот это навороты... когда разбирался - почти ничего не понимал. А уж открытий для себя сделал просто кучу, хотя до конца как работают некоторые вещи так до сих пор и не понимаю...
_DEN_ Код (Text): template<class T> class A<vector<T> > AFAIK, это не специализация шаблоном, а просто частичная специализация типом. Т.е. по идее то же, что и Код (Text): template<class T> class A<T* > А специализировать шаблоном можно шаблоны объявленные например так: Код (Text): template<template<class>class>class A;
Kola Что-то они слишком намудрили, есть метод проще: Код (Text): #define m0(x) "" #define m1(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) m0(x) #define m2(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) m1(x) #define m3(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) m2(x) #define m4(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) m3(x) #define m5(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) m4(x) #define m6(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) m5(x) #define m7(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) m6(x) #define m8(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) m7(x) #define m9(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) m8(x) void main() { char s[]=m9(0); return; } BC31 компилирует это нормально, а VC6 жалуется на нехватку памяти
_DEN_ На месте pObject в изначальном примере была функция и чтоб узнать что pObject всегда == 0 нужно её сначала инлайнить, а это уже выходит за рамки стандарта. Так что без оптимизации (в общем случае) второе условие тоже попадёт в код. А роль IsProperty() я не очень понял... Или это просто ради примера?
Quantum somefunc была второй. То что она никогда не выполнится - это стандарт, а то что ее кода не будет в exe-шнике это оптимизация. Просто пример. Показать что если pObject == 0, то ничего страшного не будет, т.к. его метод не будет вызван.
_DEN_ Только после того как мы докажем что f (которая вместо т.н. pObject) всегда будет 0! Но как мы об этом узнаем без инлайна? - Никак, т.к. стандарт никого не обязывает оптимизировать код. Вот, именно! А изначальный пример был несколько иным.
_DEN_ BC больше 76 звездочек не компилирует, а вот VC сдался на 1011-ой. Но компилируется это очень быстро.