🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #16288

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

#16288
From: Seweryn Habdank-Wojewódzki
Date: Wed, 11 Apr 2007 22:26
122 lines
5049 bytes
Witam

Adam Karpierz wrote:

> Sektor czy Ty czujesz ze dzieki takiemu podejsciu
> wystarcza w Javie _jedna_  (jak to w C++ sie nazywa)
> "specjalizacja" szablonu obslugujaca wszystkie typu
> wywodzace sie od klasy bazowej ?
> Czy ty czujesz juz ze taki "szablon" mozna spokojnie
> skompilowac, umiescic w bytecode a bedzie dobrze
> dzialal wlasnie dzieki podejsciu obiektowemu
> a nie "pieczatkowemu" jeno ?.

Nie całkiem. Są możliwe konstrukcje oparte o polimorfizm statyczny paskudnie 
osiągalne na drodze polimorfizmu dynamicznego.

Polecam głębokie studium pojęcia specjalizacja szablonu.

Na grupie o C. Podałem pewien przykład w wątku "Dziedziczący wraper".

A z grubsza chodzi o coś takiego:

template < typename Result, typename Arg >
class foo {
public:
  typedef Result result_t;
  typedef Arg arg_t;
  result_t operator() ( arg_t const & t ) {
    // ... pracujemy z uwzględnieniem typów result_t i arg_t
  }
};

// i np. specjalizacja
template < typename Arg >
class foo <void,Arg>
{
  //... robimy dziwne rzeczy kiedy zwracany jest void.
}

// i np. specjalizacja
template < typename Result >
class foo <Result,void>
{
  //... robimy dziwne rzeczy kiedy argument jest void.
}

// i np. specjalizacja
template <>
class foo <void,void>
{
  //... robimy jeszcze dziwniejsze rzeczy kiedy,
  // argument jest void i wynik jest void
}

Aby to zrobić w oparciu o dziedziczenie musimy stworzyć kilka klas bazowych.
Do tego kod będzie musiał mieć jeszcze albo enum, albo jakąś klasę która
poprzez dzidziczenie wskaże na "specjalizację (dynamiczną)". W końcu dla
POD musimy mieć wrapery. Jeśli założymy, że je mamy tak jak w Javie jest
int oraz Integer to powstaje i tak pytanie jak zawrapować void, czy
oszukiwać i dawać int/Integer zamiast void i tak dalej. Oczywiście w
Pythonie nie ma problemu pod warunkiem, że w obrębie pracy z typami nie
mamy jakichś spraw np wyboru optymalnego algorytmu potęgowania, czy też np.
liczenia silni vs. funkcji Gamma - kiedy np. Arg jest int lub double i
chcemy liczyć arg! to raz dobrze jest mieć "!" dla typów
całkowitoliczbowych, a raz trzeba liczyć wartość funkcji Gamma.

> Czy ty rozumiesz juz, ze to co jest w Javie
> to jest typowy przyklad generyka
> polimorficznego parametryzowanego typem ?

No i? Mnie np. bardzo podoba się w Javie możliwość zadania pytania

class foo < ? extends bar >

> Sektorku kochany , racz zauwazyc ze operator ++ w ogole nie
> dziala na typie ale na _iteratorze_ i duze g.. wie jaki jest typ obiektu
> kontenera.

Inny jest iterator dla std;;list<double> inny dla std::vector<MyClass>.
A find_if rozróżnia je sam. Zresztą każdy algorytm tak robi.

Jest też takie coś: iterator::value_type i to jest typ wartości pokazywanej
przez iterator.

> On zna tylko typ iteratora (podanego mu explicite przez 
> kompilator) i wie ze na tymze ma wykonac metode operator ++

Ciekawe, że operator++ musi być wykonany dla konkretnego typu iteratora.

> Potem, wie tylko ze ma wykonac metode operator *

Jw.

> a potem funkcje operatorowa operator ==

Jw.

> Tyle.

No tak.

> W calej find_if (czy innych tego rodzaju rozwizazaniach)
> typ _samego obiektu_ nie jest nigdzie potrzebny.

Nie jest potrzebny to nie znaczy, że nie osiągalny. Rozdział 7.5 z
książki "C++ Biblioteka standardowa", N.M. Josuttis.

> Stad te Wasze bajki o "dedukcji typu" przez yntelygentny
> szablon to wlasnie miedzy... bajki wlozyc.

Ja sobie życia ni utrudniam i te iteratory, które używam znają typ elementu.
Każdy używa co lubi.

A z ciekawych rzeczy polecam głębokie studium kolekcji połączonych z
boost::any, kiedy istotnie trzeba głębiej zapytać o typ elementu
zapakowanego do kolekcji.

Pozdrawiam.

-- 
|\/\/|   Seweryn Habdank-Wojewódzki
 \/\/
Technical Details
Message-ID: <evjnda$l50$1@tkdami.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.tkdami.net!news.tkdami.pl!not-for-mail
References: <slrnf1kjcu.ave.lrem@lrem.maxnet><evdqq6$qrs$3@news.onet.pl> <desk13psu2rvekht584uoirc0djahrk1dv@4ax.com> <87irc5fnin.fsf@hector.domek> <1176232119.821172.37680@n76g2000hsh.googlegroups.com> <evh5i9$qho$1@inews.gazeta.pl> <1176316203.969378.31720@d57g2000hsg.googlegroups.com> <evje25$sbt$1@inews.gazeta.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.tkdami.net!news.tkdami.pl!not-for-mail
From: Seweryn Habdank-Wojewódzki <habdank@gmail.com>
Newsgroups: pl.comp.objects
Subject: Re: Typ należący do parametru template'a
 (czyli STL w parametrze)
Date: Thu, 12 Apr 2007 00:26:16 +0200
Organization: VectraNet Oswiecim
Lines: 123
Message-ID: <evjnda$l50$1@tkdami.pl>
References: <slrnf1kjcu.ave.lrem@lrem.maxnet><evdqq6$qrs$3@news.onet.pl> <desk13psu2rvekht584uoirc0djahrk1dv@4ax.com> <87irc5fnin.fsf@hector.domek> <1176232119.821172.37680@n76g2000hsh.googlegroups.com> <evh5i9$qho$1@inews.gazeta.pl> <1176316203.969378.31720@d57g2000hsg.googlegroups.com> <evje25$sbt$1@inews.gazeta.pl>
Reply-To: habdank@gmail.com
NNTP-Posting-Host: 82.139.21.12
Mime-Version: 1.0
X-Trace: tkdami.pl 1176330475 21664 82.139.21.12 (11 Apr 2007 22:27:55 GMT)
X-Complaints-To: usenet@news.tkdami.pl
NNTP-Posting-Date: Wed, 11 Apr 2007 22:27:55 +0000 (UTC)
User-Agent: KNode/0.10.4
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit