🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #16275

Re: Typ należący do parametru template'a (czyli STL w parametrze)

#16275
From: ethouris
Date: Tue, 10 Apr 2007 19:08
62 lines
4150 bytes
On 9 Kwi, 19:47, p...@gazeta.pl (Piotr Dembiński) wrote:
> A.L. <f...@2005.com> writes:
>
> [...]
>
> > Szablony to zwykly makrogenerator i z obiektowoscia nic zgola
> > wspolnego nei maja.
>
> Programowanie generyczne.  Swoją drogą to ciekawie mogłaby wyglądać
> biblioteka STL dla ANSI C zrealizowana w oparciu o procesor makr M4.

Pomijając już kwestie "makrogeneratorowatości" szablonów C++, o czym
nie chce mi się już pisać, bo argumenty panów AL + AK od zawsze w tym
temacie były typu "makrogenerator, bo tak" - problem polega na tym, że
STL opiera się nie tylko na samych szablonach, ale również np. na
przeciążaniu. I tu nie chodzi o to, że mamy np. kilka wersji funkcji
transform() z różną ilością argumentów, ale również o dedkukcję typów
w przypadku ptr_fun, czy bind2nd.

Druga sprawa to specjalizacja szablonu. Nie istnieje taki
makrogenerator, który potrafi:
a) dedukować parametr
b) specjalizować wzorzec wybiórczo

Do tych obu rzeczy potrzebne są takie konstrukcje, które pracują
bezpośrednio na elementach języka. Makrogenerator nie potrafi, po
otrzymaniu 'a', dowiedzieć się, że 'a' jest obiektem typu 'int' i
przekazać owo 'int' jako parametr. Makrogenerator nie potrafi również
domyślić się, które z części definicji wzorca są używane w miejscu
specjalizacji, a które nie.

Przykładowo, weźmy takie find_if, zrealizowane jako makro:

x = FIND_IF( LIST, ls->head, ls->tail, bool (*)(int),
is_divisible_by_3 );

LIST potrzebujemy do tego, żeby mieć nagłówek do zestawu funkcji
charakterystycznych (w tym funkcji określającej metodę awansowania
iteratora), a typ funkcyjny po to, żeby można było przekazać funkcję
is_divisible_by_3. Ja i tak nawet nie mam pewności, czy w tym powyżej
jeszcze nie brakuje czegoś dodatkowego. W przypadku prawdziwego STL z C
++ wygląda to oczywiście

x = find_if( ls.begin(), ls.end(), is_divisible_by_3 );

Nie wspominając już o tym, że tam nawet nie trzeba definiować osobno
funkcji ze specjalizacją argumentu:

x = find_if( ls.begin(), ls.end(), bind2nd( is_divisible_by, 3 ) );

STL i tak ma zresztą jeszcze poważny design flaw polegający na tym, że
nie należało w algorytmach dawać osobnych argumentów dla początkowego
i końcowego iteratora (generalizacja poszła nie w tą stronę, co
trzeba). Po uzupełnieniu o wszystkie braki najpewniej przyszła wersja
będzie wyglądać tak:

x = find_if( ls, bind( is_divisible_by, _1, 3 ) );

I dlatego właśnie nigdy nie powstała biblioteka generyczna oparta na
makrach i nigdy takowa nie powstanie. Z prostej przyczyny - nikt by
jej po prostu nie używał, bo interfejs takiej biblioteki byłby na tyle
koślawy, że każdego by odrzucało.
Technical Details
Message-ID: <1176232119.821172.37680@n76g2000hsh.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!news.glorb.com!postnews.google.com!n76g2000hsh.googlegroups.com!not-for-mail
References: <slrnf1kjcu.ave.lrem@lrem.maxnet><evdlhb$f4p$1@inews.gazeta.pl> <evdqq6$qrs$3@news.onet.pl> <desk13psu2rvekht584uoirc0djahrk1dv@4ax.com> <87irc5fnin.fsf@hector.domek>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!feed.news.interia.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!news.glorb.com!postnews.google.com!n76g2000hsh.googlegroups.com!not-for-mail
From: "ethouris" <ethouris@gmail.com>
Newsgroups: pl.comp.objects
Subject: Re: Typ należący do parametru template'a
 (czyli STL w parametrze)
Date: 10 Apr 2007 12:08:39 -0700
Organization: http://groups.google.com
Lines: 70
Message-ID: <1176232119.821172.37680@n76g2000hsh.googlegroups.com>
References: <slrnf1kjcu.ave.lrem@lrem.maxnet><evdlhb$f4p$1@inews.gazeta.pl>   <evdqq6$qrs$3@news.onet.pl>   <desk13psu2rvekht584uoirc0djahrk1dv@4ax.com>   <87irc5fnin.fsf@hector.domek>
NNTP-Posting-Host: 81.219.244.75
Mime-Version: 1.0
X-Trace: posting.google.com 1176232120 7433 127.0.0.1 (10 Apr 2007 19:08:40 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Tue, 10 Apr 2007 19:08:40 +0000 (UTC)
In-Reply-To: <87irc5fnin.fsf@hector.domek>
User-Agent: G2/1.0
X-HTTP-UserAgent: Opera/9.10 (Windows NT 5.0; U; pl),gzip(gfe),gzip(gfe)
Complaints-To: groups-abuse@google.com
Injection-Info: n76g2000hsh.googlegroups.com; posting-host=81.219.244.75;   posting-account=W6788A0AAADjfLYufIDScQB28tLT5-6D
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit