Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi - приемущества и недостатки, принимаются различные высказывания 
:(
    Опции темы
Romikgy
Дата 28.1.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



MAKCim, то полиморфизм можно сделать и для шаблоных классов я в курсе,
имхо я имел ввиду немного другое


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Beltar
Дата 28.1.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Не надо путать понятия, препрцессор он на то и "пре", что не знанимается глубоким анализом текста. Всё что связано с типами и сложными языковыми структурами, это уже компилирование. И иной раз вывод типа совсем не очевиден. А если учесть мерджинг уже инстанцированных шаблонов для оптимизации, то это вообще к задаче препроцессора не относится совсем. Так что так.


А может тогда определимся с терминологией. ИМХО любая обработка кода перед компиляцией есть препроцессинг и какие он там методы использует мне побоку. Я лично считаю его злом.

Цитата

нет. см. выше


Более сложных средств она не требует.

Цитата

когда я вижу что -то типа "средствами IDE", то мне становится смешно. Такое может написать только дельфин У некоторых компиляторов вообще нет стандартных IDE.


Есть 2 типа компиляторов (по крайней мере в Windows), те у которых есть IDE и те, которые никто не использует.
Кстати, столь любимая Майкрософт Венгерская нотация, небесполезная в Turbo C, Turbo Pascal, или в распечатке, в Delphi превращается в самую настоящую Трансильванскую ересь, т. к. тип переменной можно узнать просто наведя на нее мышь.

Цитата

Если для тебя оптимизация это только inline, то тут говорить нечего. Опять совет, читай книги.


А чем оптимизация явно описанных функций, отличается от оптимизации автоматически генерируемых? На кники ссылаться не надо, мне интересно, как ты мне это объяснишь. А ссылку на книги я воспринимаю только как неспособность возразить.

Цитата

Мне всё равно что внутри, я просто беру std::string и им пользуюсь. И получаю кучу функционала практически бесплатно. И ещё имею возможность кастомизировать их в очень широких пределах.
А то что под всеми строками скрывается массив байт, то это уже проза жизни.
Но разумных С++ программистов гораздо больше.


Пользуйся. Но тут прозвучало утверждение, что в С++, строки лучше, чем в Delphi. Я жду пояснений чем они лучше, а то я в каждой программе ANSIString юзаю и еще ни разу не быо такого, чтобы мне чего-то не хватало.
Насчет разумных программистов. Ты как считал, тех кто работает, или еще и тех кому зачет надо?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Daevaorn
Дата 28.1.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 5
Всего: 70



Цитата(Beltar @  28.1.2007,  21:09 Найти цитируемый пост)
А может тогда определимся с терминологией. ИМХО любая обработка кода перед компиляцией есть препроцессинг и какие он там методы использует мне побоку. Я лично считаю его злом.

Цитата(Beltar @  28.1.2007,  21:09 Найти цитируемый пост)
Более сложных средств она не требует.

Вот пример кторый привел MAKCim невозможно сделать никаким препроцессором. Ты не понимаешь, что есть что, но при этом споришь. Ужас.
Цитата(Beltar @  28.1.2007,  21:09 Найти цитируемый пост)
А чем оптимизация явно описанных функций, отличается от оптимизации автоматически генерируемых? На кники ссылаться не надо, мне интересно, как ты мне это объяснишь. А ссылку на книги я воспринимаю только как неспособность возразить.

Потому что шаблоны это не только подстановка. Ты вообще шаблоны понимаешь? Вот объясни, что делает код который привел MAKCim?
Цитата(Beltar @  28.1.2007,  21:09 Найти цитируемый пост)
 Но тут прозвучало утверждение, что в С++, строки лучше, чем в Delphi. Я жду пояснений чем они лучше, 

Отмотай с десяток страниц назад, я там это доказал и привел примеры кода.
Цитата(Beltar @  28.1.2007,  21:09 Найти цитируемый пост)
Насчет разумных программистов. Ты как считал, тех кто работает, или еще и тех кому зачет надо? 

Для тех кто думает, а не кнопки на формы кидает.
PM MAIL WWW   Вверх
MAKCim
Дата 28.1.2007, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата

Но тут прозвучало утверждение, что в С++, строки лучше, чем в Delphi. Я жду пояснений чем они лучше

1. Не являются частью языка
2. Класс-шаблон (параметризация и пр.)
Цитата(Beltar @  28.1.2007,  20:09 Найти цитируемый пост)
А может тогда определимся с терминологией. ИМХО любая обработка кода перед компиляцией есть препроцессинг и какие он там методы использует мне побоку. Я лично считаю его злом.

Шаблоны != препроцессинг, т. к парсинг шаблонов осуществляется компилятором
Препроцессинг - "тупая" подстановка текста, шаблоны - "умная" манипуляция с типами 



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 28.1.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



Вот для раздумий любителей си smile
исходник игры шахматы , где то на просторах нета вытащил
Код

/*
 *   Вот программа, занявшая первое  место ("Best of Show") в этом году.  Она
 * вызывается с необязательным числовым параметром (по умолчанию 2) и  играет
 * в шахматы.  Параметр определяет глубину  просмотра  (при  глубине большей,
 * чем 3,  она будет думать  очень долго). Ходы  задаются двумя восьмеричными
 * числами (откуда куда  - см. доску в  начале игры, например, "e2-e4"  нужно
 * будет вводить как "64 44"), в приглашении к приему указывается  количество
 * просмотренных ходов  и оценка позиций  - своей и  противника, т.е.   Вас).
 *
 * Правила игры несколько упрощены - пешки превращаются только в ферзей,  нет
 * взятия на проходе и длинной рокировки (мне и короткую сделать не удалось),
 *   а   также   контроля   правил    повторения   позиций   и   50    ходов.
*/


#include <stdio.h>
#include <stdlib.h>

#define m(x)(x<0?-1:!!x)
#define g tj()-J
#define a(x)(x<0?-x:x)
#define h(x)((x)<=K?x:N-(x))
#define f 9999
#define A return
#define H printf(
#define R double
#define U int
#define V for
#define b else
#define u while
#define B if
U v,w,Y= -1,W,J,p,F,o=f,M,N,K,X,YY,_,P[f],s(); typedef U(*L)(); L q[f]; tj(){
U S=m(v)+(m(w)<<K); B(!S)A J; V(v=W+S; v!=J&&!q[v]; v+=S); A v; } k(){ _=K; A
v?a(v)>1||w-Y||!q[J]:(w-Y&&(w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/ 2))||q[J];
} z(){ _=5; A v*w||g; } e(){ _= -2;
A(v*v*v-v||w*w*w-w)&&(J-W-2||(W&N)-4||(W>>K!=(Y-1?N:0))||
q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*Y<0); } R VR(){ int PZ=0x7fff;
A(R)(rand()&PZ)/(R)PZ; } l(){ _=K+1; A(v*w&&a(v)-a(w))||g; } R UC(){ R i=0,d;
u((i+=d=VR())<1.0); A d; } c(){ _= -11; A a(v)-a(w)||g; } I(ur,n,x){ W=ur;
J=n; B(P[W]!=Y||P[J]==Y)A J+1; v=(J&N)-(W&N); w=(J>>K)-(W>>K); A
q[W]()||(x&&QL(W,J,s)); } TT(W){ v=w=0; A q[W]()+K; } s(){ U j= -1,i; Y= -Y;
V(i=0; i<M; ++i){ B(j<0&&P[i]== -Y&&TT(i)&&_== -2) { j=i; i= -1; } b
B(j>=0&&!I(i,j,0))A Y= -Y; } A!(Y= -Y); } bb(){ _=1; A a(v*w)-2; } uv(){
V(v=0; v<f; ++v){ B(h(v>>K)==0){ U S=h(v&N);
q[v]=!S?z:(S==1?bb:(S==2?c:(v&N>K?l:e))); } b B(h(v>>K)==1)q[v]=k; b q[v]=0;
P[v]=!!q[v]*(28-v); } } y(){ U G=Y,i; J=0; V(i=0; i<M; ++i){
i%8||H"\n%4o ",i); B((Y=P[i]=m(P[i]))&& TT(i))H"%c ",_+93+Y*16); b H"- "); }
H"\n    "); do H"%2d",i++&N); u(i&N); Y=G; H"\n"); } O(W,J){
B((q[J]=q[W])==k&&h(J>>K)==0)q[J]=l; B(q[W]==e)B(J-W==2)O(J+1,J-1); b
B(W-J==2)O(W-1,W+1); P[J]=P[W]; q[W]=0; P[W]=0; } QL(W,J,D)L D; { U
HQ=P[J],YX; L AJ=q[J],XY=q[W]; O(W,J); YX=D(); O(J,W); q[J]=AJ; q[W]=XY;
P[J]=HQ; A YX; } C(){ U i,j,BZ=0; V(i=0; i<M; ++i){ L Z=q[i]; B(Z){ U
r=h(i>>K)+h(i&N),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]<0?N-(i>>K):(i>>K)):
(Z==l?124-((YY<8&&((i&N)!=K|| (i>>K)!=(P[i]>0?0:N)))?M:0):
(Z==c?41+r:(Z==e?f-r-r:36+r+r)))); Y=P[i]; V(j=0; j<M;
++j)B(!I(i,j,0))S+=(P[j]?5:1); BZ+=G==Y?S:-S; Y=G; } }
B(!(++X&M-1))write(1,".",1); A BZ; } PX(){ U i,Q=0,XP=0,JZ=M*M,E= -f,t,S=o;
B(!F--)A++F+C(); V(i=0; i<JZ; ++i)B(!I(i>>K+K,i&M-1,1)){ Y= -Y; o= -E; t=
-QL(i>>K+K,i&M-1,PX); Y= -Y; B(t>E){ ++XP; Q=i; E=t; B(E>=S) A++F,E; } }
B(!XP)E=s()?-f+1:0; p=Q; A++F,E; } RZ(){ U i,j,T=0; V(; ; ){ y(); o=f; do{
H"\n%d %d %d %s ",X,T,C(),s()?"!":">"); fflush(stdout); }
u(scanf("%o%o",&i,&j)!=2||I(i,j,1)); O(i,j); y(); X=0; ++YY; Y= -Y; T=PX();
i=p>>(K<<1); j=p&(M-1); B(I(i,j,1)){ H"Rats!\n"); A; } O(i,j); Y= -Y;
B(T>M*M)H"\nHar har.\n"); } } main(ac,av)char**av; { long time(),j=time(&j);
R i=0; srand((U)j); V(M=0; M<=f; ++M)i+=UC(); M=i/100; B(M&3)++M; B(M&1)--M;
V(N=1; N*N<M; ++N); K= --N/2; F=ac>1?atoi(av[1]):2; uv(); RZ(); }

правда у мя компилится не захотел видать гдето порезали исходник


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Beltar
Дата 29.1.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Daevaorn

Цитата

Вот пример кторый привел MAKCim невозможно сделать никаким препроцессором.


Только часто ли подобное нужно.

Цитата

 Не являются частью языка


Для меня с точностью до наоборот.

Цитата

Шаблоны != препроцессинг, т. к парсинг шаблонов осуществляется компилятором
Препроцессинг - "тупая" подстановка текста, шаблоны - "умная" манипуляция с типами 


Мне это абсолютно все равно. Хотя можно и перед компиляцией сгенерить препроцессором шаблонную функцию. Меня интересует автоматическая генерация кода и шаблон, как бы он там не реализовывался, я сначала считал хорошей вещью, но потом передумал.

Цитата

Вот объясни, что делает код который привел MAKCim?


Я обратил внимание только на использование нескольких типов, а что он делает мне побоку.

Цитата

Для тех кто думает, а не кнопки на формы кидает.


Да, я предпочитаю, покидать на форму основные компоненты интерфейса, а потом постепенно писать свои килобайты кода, не вылезай из редактора с отладчиком а вы сидите с компиляторами без IDE.  smile 

PS Объяснения оптимизации не увидел.

Добавлено @ 00:53 
Цитата

Вот программа, занявшая первое  место ("Best of Show") в этом году.


Это не конкурс на самую запутанную программу?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Daevaorn
Дата 29.1.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 5
Всего: 70



Цитата(Beltar @  29.1.2007,  01:50 Найти цитируемый пост)
Я обратил внимание только на использование нескольких типов, а что он делает мне побоку.

Всё ясно, ты тот код просто не понял. Тогда вести с тобой разговор по поводу шаблонов не имееет смысла - ты их не знаешь. Зачем тогда спорить? Не понятно.
Цитата(Beltar @  29.1.2007,  01:50 Найти цитируемый пост)
PS Объяснения оптимизации не увидел.

Я уже говорил про статический полиморфизм. Но ты и его видимо не знаешь. Жаль.
Цитата(Beltar @  29.1.2007,  01:50 Найти цитируемый пост)
Да, я предпочитаю, покидать на форму основные компоненты интерфейса, а потом постепенно писать свои килобайты кода, не вылезай из редактора с отладчиком а вы сидите с компиляторами без IDE.  

да, мы компоненты никуда не кидаем, мы деньги зарабататываем. попробуй, может и тебе понравится.
PM MAIL WWW   Вверх
Beltar
Дата 29.1.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 2
Всего: 7



Цитата

Всё ясно, ты тот код просто не понял.


Я его и не просматривал.

Цитата

Я уже говорил про статический полиморфизм. Но ты и его видимо не знаешь. Жаль.


Скажем так, я и термина-то такого не слышал. smile

Цитата

да, мы компоненты никуда не кидаем, мы деньги зарабататываем. попробуй, может и тебе понравится.


Ну это потому что в VS такого понятия как компонент нету. Есть классы библиотек MFC и ATL. А кнопка и текстовое поле они и в VCL и в MFC и даже в какой-нибудь библиотеке для какого-нибудь экзотичесого языка кнопка и текстовое поле.



--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alexeis
Дата 29.1.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Шаблон по сути представляет возможность создавать объект/процедуру, которая маниплирует неким абстарактный объектом, но который должен реализовывать определенный строго заданный интерфес.

Если посмотреть на следующую картинку,

user posted image

то видно, что тот объект котрый реально подставяется может быть намного сложнее, но в действительности в шаблоне мы можем использовать только закрашенную область, иначе шаблон будет не совместим с другими классами. В терминах делфи различные объекты должны реализовать один общий интерфес, тогда объект, например контейнер, сможет получить доступ к его методам и тем самым вызывать одноименные методы у совершенно разных объектов. Т.о. для построения аналогичной схемы в делфи требуется явно описать общий интерфес, затем пронаследовать этот интерфес всеми объектами, которые нам необходимы в качестве элементов, того же контейнера, реализовть этот интерфес - создать все описанные в интерфесе методы. После этого класс контейнер использует уже не указатель на объект, а указатели на интерфес, который является аналогом псевдоним типа в С++. Интерфес же в С++ является неявным, что усложняет разработку, ведь для правильной работы, объекты - элементы обязаны реализовать определенный интерфейс, иначе контейнер не сможет использовать все нужные методы и операторы (просто не пройдет этап компиляции). 
  Так вот в делфи RTTI позволяет реализовать передачу класса в виде переменной. Теперь если в конструкторе контейнера передать класс элементов (реализующих интерфес), то при помощи этой переменной легко создаются любое количество объектов-элементов, а доступ к ним происходит по средством итерфеса. Нужный функционал реализован, причем подчеркиваю интерфес задан явно и самоописан, тогда как в С++ это прийдется указывать в документации.

  В этом виде я ставлю знак равенства между псевдонимом типа и интерфесом.
Так что подобный механизм (логика псевдонима класса) реализован в делфи, пусть иначе, но и логика программирования в делфи несколько иная.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Artemios
Дата 29.1.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 10
Всего: 50



Мда...
Шаблонов я не знаю, но так как в Дельфи нету их -- сие есть зло великое однако...
Не используешь IDE гуёвый -- зваться недостоин программистом...
 smile 


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
MAKCim
Дата 29.1.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Alexeis @  29.1.2007,  12:49 Найти цитируемый пост)
тогда как в С++ это прийдется указывать в документации.

[censored 2] ...
я же пример привел, можно сделать рекурсивный compile_time_if, который будет всевозможные инварианты проверять: наличие методов, псевдонимов типов и т. д
в случае, если какой-то инвариант не выполняется, можно, например, прервать компиляцию
Код

template<bool Expression> struct invariant;
template<> struct invariant<true> {};

template<class T> class example
    : public typename compile_time_if<is_class<T> :: value, T, invariant<is_class<T> :: value> > {
...
};


Добавлено @ 13:12 
Цитата(Beltar @  29.1.2007,  00:50 Найти цитируемый пост)
Мне это абсолютно все равно. Хотя можно и перед компиляцией сгенерить препроцессором шаблонную функцию. Меня интересует автоматическая генерация кода и шаблон, как бы он там не реализовывался, я сначала считал хорошей вещью, но потом передумал.

Ты вообще знаешь, что такое компиляция?
И как ты будешь генерировать функцию из ее шаблона перед компиляцией?
например
Код

template<class T> void example(const T& __val) {
}

int main() {
    example(2007);
    return 0;
}

т. е ты должен определить, что T - int, для этого тебе требуется анализ исходного кода, а это уже компиляция
Что делает препроцессор. Он просматривает исходный код, тупо находя все определенные #define-ом макроконстанты и заменяя их на их значения в исходном коде. Т. е ему не нужна не структура программы, не типы и т. д



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Alexeis
Дата 29.1.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 14
Всего: 459



Цитата(MAKCim @  29.1.2007,  13:03 Найти цитируемый пост)
[censored 2] ...
я же пример привел, можно сделать рекурсивный compile_time_if, который будет всевозможные инварианты проверять: наличие методов, псевдонимов типов и т. д
в случае, если какой-то инвариант не выполняется, можно, например, прервать компиляцию

  Да я не сомневаюсь, что компилятор выругается на не соответствие типов. Слава богу не глупый, но определять нужные метода и операторы по ошибкам компилятора не лучшая идея, хотя в данном случае вопрос не принципиальный.

MAKCim, если не сложно, опиши подробней, свой код, а то я  smile, но суть ни как  smile

Добавлено @ 14:04 
template<bool Expression> struct invariant; - как я понял описывается шаблон стркутуры под названием invariant, но описание самой структуры я не вижу (ее поля и т.д.), что за слово Expression также не понятно.

вот это похоже на создание нового шаблона на основе шаблона структуры invariant
template<> struct invariant<true> {}; но почему-то вместо типа подставляется значение. Смысл пустого шаблона не ясен. Описание шаблона на основе заранее определенного типа тоже. Причем тут отсутствует даже идентфикатор нового шаблона smile 



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MAKCim
Дата 29.1.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Код

/* определяем шаблон для K = false;  compile_time_if<false, T1, T2>::type вернет T2; вместо false может быть 0 */
template<bool K, class T1, class T2> struct compile_time_if {
    typedef T2 type;
};
/* специализация для K = true;  compile_time_if<true, T1, T2>::type вернет T1; вместо true может быть все != 0 */
template<class T1, class T2> struct compile_time_if<true, T1, T2> {
    typedef T1 type;
};

/* SFINAE метод определения, является ли тип T - классом */
template<class T> class is_class {
    /* T1 и T2 имеют намерянно разные размеры */
    typedef char T1;
    typedef { char __a[2]; } T2;

    template<class C> static T1 what(int C::*);
    template<class C> static T2 what(...);
public:
   /* 
    * определение what() тут не важно, sizeof() направлен только на возвращаемое им значение 
    * элипсис (...) имеет низший приоритет при неявном преобразовании типов
    * если 0 нельзя привести к указателю на функцию-член класса, в данном случае T, то
    * sizeof вернет размер T2, потому как преобразование к ... всегда возможно, а т. к sizeof(T1) != sizeof(T2),
    * value = 0, что говорит о том, что T - не класс
    */
    enum {value = sizeof(is_class<T> :: what<T>(0)) == sizeof(T1) };
};
template<class T> class wrapper {
...
};
template<class T> class example
    /* 
     * наследовать можно только классы; is_class<T> :: value - compile-time константа: 0 или 1, причем
     * если T - класс, то is_class<T> :: value = 1 = true, т. е typename compile_time_if<true, T, wrapper<T> > = T,
     * т. е наследуемся напрямую от T, иначе - от класса wrapper, который в данном случае инкапсулирует T
     */
    : public typename compile_time_if<is_class<T> :: value, T, wrapper<T> > :: type {
...
};

Код

template<bool Expression> struct invariant;
/* invariant определен только для Expression = true = все кроме 0 */
template<> struct invariant<true> {};

template<class T> class example
    /*
     * если T - не класс, то is_class<T> :: value = 0, но, для false у нас не определен invariant
     * (есть только специализация для true), поэтому компилятор сгенерирует ошибку
     */
    : public typename compile_time_if<is_class<T> :: value, T, invariant<is_class<T> :: value> > {
...
};


Добавлено @ 14:18 
Цитата(Alexeis @  29.1.2007,  13:50 Найти цитируемый пост)
template<bool Expression> struct invariant; - как я понял описывается шаблон стркутуры под названием invariant, но описание самой структуры я не вижу (ее поля и т.д.), что за слово Expression также не понятно.

Это не описание, а объявление, т. е описание может быть дальше по тексту или его может вообще не быть
Expression - любая compile-time константа
т. е если у нас например есть шаблон
Код

template<bool Expression> struct example {
    enum {value = Expression};
};

то
Код

...
int a = example<0> :: value;
int b = example<1> :: value;
...

a будет равно 0, b - 1, причем эти 0 и 1 - константы (явно видны в коде на ассемблере)
Код

mov    [ESP - 4], 0
mov    [ESP - 8], 1


Добавлено @ 14:21 
Цитата

вот это похоже на создание нового шаблона на основе шаблона структуры invariant
template<> struct invariant<true> {}; но почему-то вместо типа подставляется значение. Смысл пустого шаблона не ясен

Это называется специализацией шаблона
Грубо говоря, если тип соответствует типу в какой-то специализации шаблона, то для инстанцирования будет выбрана специализация, а не primary шаблон
Смысл пустого шаблона - ничего не делать, если Expression == true  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Romikgy
Дата 29.1.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 3
Всего: 146



MAKCim, и ты хочешь сказать что это все просто для понимания?

Цитата(MAKCim @  29.1.2007,  13:10 Найти цитируемый пост)
template<class C> static T1 what(int C::*);

объясни плз, раньше я такого не видал просто smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
likehood
Дата 29.1.2007, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: нет
Всего: 24



Цитата(Alexeis @  29.1.2007,  13:49 Найти цитируемый пост)
Интерфес же в С++ является неявным, что усложняет разработку, ведь для правильной работы, объекты - элементы обязаны реализовать определенный интерфейс, иначе контейнер не сможет использовать все нужные методы и операторы (просто не пройдет этап компиляции). 

Совсем не обязательно неявный интерфейс усложняет разработку. Наоборот, он может упростить ее, поскольку не надо тратить время на выделение и объявление общего интерфейса. Кроме того, шаблоны позволяют работать с объектами, которые не имеют общего интерфейса, а лишь некоторое его подмножество. Например, если параметром шаблона явяется встроенный тип (скажем int), то мы не может вызывать методы у такой переменной. Но это не мешает в шаблонном классе написать метод, который вызывает некоторый метод у объекта с типом-параметром шаблона. То есть для некоторых параметров шаблонов доступна только часть функциональности, причем это проверятся на этапе компиляции.
В то же время, можно использовать и обычные интерфейсы, как в Делфи. Таким образом, шаблоны не отменяют использование интерфесов, а лишь дополняют их.
Попутно возникает вопрос к Beltar'у: вот ты говоришь, что вместо шаблонов можно использовать средства IDE, а как ты себе представляешь реализацию всего этого?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.