Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Což takhle
dát si Lopuch?

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Klub C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.
Archiv

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
 Titulek, text příspěvku  
Opište pozpátku následující text bez prostředního znaku: lnulxdf
[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
bredy 1.11.2007 11:14  689
ještě ke genericeJeště bych zde rozlišil dva pohledy na generiku
-uživatel generiky = je přesne to co popisoval huh, programátoři, kteří využívají už navržených generických algoritmů takže dosazují typy do šablon a generují konkrétní instance těchto algoritmů.
-tvůrci generiky = jsou lidé, kteří navrhují nové generické třídy šablony, jsou to šamani, kteří umí čarovat se šablonami a umí napsat někdy často velice geniální algoritmy, kterým občas normální smrtelník nerozumí.

Pro první skupinu může být programování podle A.S. jistě zajímavým námětem. Té druhé skupině to však asi nic říkat nebude,protože aby někdo mohl být tém šamanem, musí mít všechny tyhle fígle dávno v malíčku (a musí být i něco víc).
bredy 31.10.2007 13:48  688
huhJsem trochu pesimista, když tvrdíš, že vývoj pujde dle AS
huh huh 30.10.2007 22:58  687
mpts [684]: Děkuji, potěšilo mě, že někdo pochopil, co se snažím říci.
Bredy [682]: Ale nejde o střeva, jde primárně o analýzu a návrh, ne o implementaci.
Bredy [685]: No je pravda, že já mám tendenci přesvědčovat, že pouze jedna větev toho, čemu se dnes říká GP by se tak měla nazývat, ale to je čistě terminologický detail, kde jsem ochoten ustoupit a říkat GP všemu (stejně mě vývoj převálcuje). Abych ale tu větev nějak odlišil, začal jsem jí říkat "GP dle AS", protože prostě lepší označení nemám.
bredy 28.10.2007 14:47  686
Když už mluvíme o generické programování, tak tady máte nový datový typ v C++ - Tuple, což je možná jen další pokus o implementaci tuplů v C++ (Boost, Jazyk D, typelisty od Alexandrescua, nebo Dr.Dobb's typelisty a tuple), možná i něco víc.

Následující příklad ukazuje použití bredyho tuplat jednak pomocí šablony a jednak pomocí ITuple interface (jenž umožňuje použít tuplat bez šablony!!!)
#include <stdio.h>
#include <iostream>
#include "distributor.h"
#include "tuplesx.h"

using namespace BredyLibs;

template<class T>
void tupleFn(const Tuple<T> &tuple) {

	typedef typename T::template Field<0>::Type Field1T; 
	typedef typename T::template Field<1>::Type Field2T; 
	
	Field1T val1 = tuple.template At<0>();
	Field2T val2 = tuple.template At<1>();
    std::cout << "val1: " << val1;
    std::cout << " val2: " << val2;
    std::cout << std::endl;
}

void iTupleEx(const ITuple &tuple) {

    std::cout << "tuple has "<<tuple.Size()<<" fields." << std::endl;
    for (int i = 0; i < tuple.Size(); i++) {

        if (tuple.GetRTType(i) == typeid(const char *)) 
            std::cout << "string: " << tuple.Get<const char *>(i) <<std::endl;
        else if (tuple.GetRTType(i) == typeid(int)) 
            std::cout << "integer: " << tuple.Get<int>(i) <<std::endl;
        else if (tuple.GetRTType(i) == typeid(float)) 
            std::cout << "float: " << tuple.Get<float>(i) <<std::endl;
        else if (tuple.GetRTType(i) == typeid(double)) 
            std::cout << "double: " << tuple.Get<double>(i) <<std::endl;
        else if (tuple.GetRTType(i) == typeid(long)) 
            std::cout << "long: " << tuple.Get<long>(i) <<std::endl;
        else 
            std::cout << "unknown (" << tuple.GetRTType(i).name() << ") at: " << tuple.GetVoid(i,tuple.GetRTType(i)) <<std::endl;
    }
}


int main() {
    tupleFn(TUPLE(10,"test"));
    tupleFn(TUPLE(10,20));
    iTupleEx(TUPLE(10,20,"Ahoj",20.3,12.4f,33L,true).ITuple());
    iTupleEx(emptyTuple.ITuple());
}
bredy 28.10.2007 14:36  685
MPTS: Hlavním problémem diskuze je, že huh je zahleděný do svého boha tak, že si spletl pojmy a ještě o tom přesvědčoval okolí. Jsem správce tohoto klubu a nerad bych, aby tady někdo psal nesmysl a mátl ostatní.

Řečí C++

class Genericke_programovani {...};
class STL: public Genericke_programovani


huh mne však přesvědčoval že:

class STL
class Genericke_programovani: public STL {...};

Což je chyba jak hrom a je na mne, jako moderátorovi, abych to uvedl na pravou míru.
mpts mpts Je to jinak, ba přesně naopak! 27.10.2007 20:44  684
Tato debata je mi celkem ukradená, ale mám už takový dar, že rozumím lidským nedorozuměním, tož jen drobný přípodotek pro Bredyho: když huh říká: 'A "generické programování dle A. S." == STL', pak tím myslí pouze to, STL dle něho přesně odpovídá zásadám generického programování dle A.S.
dead 26.10.2007 20:27  683
BredyUplne suhlasim. Na skole sa sice uceme zatial iba C ale nejako nikomu nevadi ze ja tie rpogramy pisem v C++ tak pri tom ostanem. Pisem v tom preto lebo som sa zaciatky ucil sam na www.programujte.cz a tam C++ a keds som prisiel na skolu nechapal som preco by som ma pouzivat scanf(/blbe znaky; blby znaky, premena/); ked na to zatial plne staci cin a premena....

Kdokoliv, mach, huh diky za odporucania...
bredy 25.10.2007 19:13  682
huhPokud je dána standardem, tak kde je ten vývoj. Jestli jen někdo dokola vylepšuje střeva... no když ho to baví...
huh huh 25.10.2007 16:11  681
Bredy [680]: Tady jde asi o nejake nedorozumeni. STL je jenom jedna a je dana standardem C++ (resp. implementaci je samozrejme vice [byt zatim vsechny, co jsem videl vychazeji z puvodni HP verze] ale musi odpovidat standardu).
bredy 23.10.2007 23:57  680
huhPokud je to navržený jinak, pak se tomu nemůže říkat STL. Bude mi program napsaný ve Stepanove STL fungovat stejne i pod MS STL? A pod GCC s STL?
huh huh 23.10.2007 22:29  679
Ale viděl jsi STL (tedy myslím tu část standardní knihovny navrženou právě S. & spol; což třeba proudy nebo řetězce už nejsou). A to je příklad knihovny navržené podle Stepanovových principů.
bredy 23.10.2007 19:34  678
huhTo si v žádném případě nemyslím. I když o Tvých návrzích nic nevím, resp. žádnou jsem neviděl.
huh huh 23.10.2007 15:21  677
Bredy [674]: Chápu, protože vyznávám jiné principy návrhu knihoven, jsem pro tebe úchylák.
huh huh 23.10.2007 15:17  676
Bredy [673]: "Vkládal jsi mi do úst, že když nepoužívám STL, neprogramuji genericky." nikdy jsem nic takovyho nedelal. pokud si me tak pochopil, tak je mi to lito, ale nemam dojem, ze bych neco takovyho byt jenom naznacoval. pouze tvrdim, ze STL je dobry priklad jednoho pristupu generickeho programovani. that's all
bredy 22.10.2007 22:31  675
Ale pravda je taková, že šablony jsou nástrojem generického programování. Umožňuje to skutečně navrhovat algoritmy nezávislé na datových typech. To je generické programování. A co víc, můžeš genericky programovat generické typy, můžeš pracovat v generickém OOP, kde existuji pojmy jako dědičnost generického typu nebo instance generického typu. Generická třída a podobně. Můžeš používat techniky pravého OOP, kde můžeš používat objekty generických tříd bez nutnosti mít nějaké rozhraní, kde pro použití instance generické třídy stačí pouze syntaxtická správnost (něco jako ve smalltalku). To je třeba důvod, proč lze udělat foreach na iterátor, ať už je to vektor, nebo strom, nebo fronta, nebo jiný kontejner.

STL je jen jakýsi demo generického programování. Ano, i o demu se dají napsat celé knihy. Ale ta pravá síla generiky se nachází právě za plotem, až se člověk odprostí od STL.

STL má spoustu problémů. Jeden za všechny, například kontejnery nemohou používat auto_ptr (to bych vraždil!) Valná většina implementací není threadsafe (a co je horší, nejsou instančně nezávislé, takže přestože pracuji s dvěma instancemi nějakého objektu z stl ve dvou threadech, tak přesto dochází ve vláknech k problémům). Streamy jsou naprosto nepoužitelné. Je to směs chaosu bez ladu a skladu. Nemá to žádnou strukturu. Zkus někdy naimplementovat vlastní stream, jako třeba v javě když podědíš OutputStream. Až mi to někdo ukáže, že to jde nějak jednoduše, začnu věřit, že stl je trochu užitečné.

A ještě ty iterátory. Jsou často těžkopádné, například pro stromy, hashe, a další. Mnohem častěji používám index + foreach a funktory. Co iterátor řeší komplikovaně (uložení stavu iterátoru, synchronizace iterátorů), to foreach + funktor řeší levou zadní. A lepší výsledky dává i překladač.

[ 380 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt