ApocalypseKÖZÖSApocalypseKözös
Chat
Degec
ExtraautistaVilágtólElzárkózottHekkerközösség
FrissVáltozások
HardverTörténet » TémaKatalógusAdminisztrációTéma
EztRajzoltuk
FilozófiaTéma
HarcművészetTéma
HumorTéma
InfoTéma
IrodalomTéma
JátékTéma
ProgramTéma
SajátLap
ZeneTéma » InfoTémaCascadingStyleSheet
JóKajáldákVendéglátóegységek
McGaffey
MsnJelszó
RenegádWebezés
Ritka Kiterjesztések
SslCertificateGyártás
SztakiMod
Tea
TechBlog
Teázók
WikiPedia » TechBlog » /2009-10-02
Chat
Degec
ExtraautistaVilágtólElzárkózottHekkerközösség
FrissVáltozások
HardverTörténet » TémaKatalógusAdminisztrációTéma
EztRajzoltuk
FilozófiaTéma
HarcművészetTéma
HumorTéma
InfoTéma
IrodalomTéma
JátékTéma
ProgramTéma
SajátLap
ZeneTéma » InfoTémaCascadingStyleSheet
JóKajáldákVendéglátóegységek
McGaffey
MsnJelszó
RenegádWebezés
Ritka Kiterjesztések
SslCertificateGyártás
SztakiMod
Tea
TechBlog
Teázók
WikiPedia » TechBlog » /2009-10-02
Mint már megszokhattátok tőlem, általában programozási ötletekért keresem fel a TechBlogot.
Ez most sincs másképp...
A nyelv C++, a kérdés pedig, hogy tudok-e olyan osztály template-et csinálni, ami csak bizonyos típusokból engedi megcsinálni a template-et? Konkrétan, szeretnék egy olyan osztály template-et csinálni, ami csak double vagy egy bizonyos saját típus (nevezzük mondjuk __CLPK_doublecomplexnek) felett működik, mással nem.
Köszi a segítséget!
Apocalypse KÖZÖS
Az álom törékeny, a vízió elhomályosulhat, ha nem tartod szíved egy biztos zugában.
Korábbi bejegyzések
Archívum
Adminisztráció
Guestbook
extending@retrogressq.govsurge@distincti.com
scorns@pushersb.net
fervently@naves.overrunsx.org
herbalist@chivalry.elementsk.edu
dauber@lichenr.int


![Validate my RSS feed [Valid RSS]](/Content/Images/valid-rss.png)
Hozzászólások
UPi hozzászólása 2009-10-02 19:11-kor
Arról írnál, hogy miért jó egy template osztályt korlátozni? Számomra dupla-plusz szükségtelennek tűnik, ha nem akarod, hogy int-re specializálódjon, akkor ne specializáld int-re...
SAdam hozzászólása 2009-10-02 20:16-kor
Egyszerű. Van egy
Matrixnevű osztályom, amire definiáltam az összes lehetséges operator overloading-ot, amire a számításaim során szükségem lehet, ezen kívül van egy rutin, ami kiadja a sajátértékeit, meg a bal- és jobboldali sajátvektorait. Ez aMatrixosztály jelenleg komplex számok formájában (konkrétan, az általam említett__CLPK_doublecomplextípusként) tárolja el magát a mátrixot.Most úgy adódott, hogy szükségem lenne egy valós mátrixot reprezentáló osztályra is. Ezért két lehetőségem van: vagy definiálok egy új osztályt, ahol a mátrix értékeit
doubleként tárolom, és szó szerint lemásolom az összes operator overloading-ot, amit csak csináltam (plusz átírom a sajátértékeket számító függvényt), vagy csinálok a már meglévő osztályból egy template osztályt, amit utána használhatokMatrix<double>vagyMatrix<__CLPK_doublecomplex>formában (ez utóbbi sokkal olvashatóbbá teszi a kódot, továbbá megkímél attól, hogy duplikálnom kelljen feleslegesen egy csomó kódot).Azért szeretném, ha mindenképp explicit definiálni tudnám azt a halmazt, amiből a mátrix készülhet, mert nem akarok olyat megengedni, hogy definiálni lehessen mondjuk
Matrix<bool>, vagy valami hasonló hülyeséget, aminek semmi értelme. Ráadásul kipróbáltam, hogy ha "csak úgy" csinálok belőle egy template-et, akkor nem fog lefordulni a kód, mert nem fogja tudni, hogy egy általános T osztályra hogyan értelmezze azt, hogy mondjuk "return T + 2", míg ha T explicit módon korlátozva van adoublevagy__CLPL_doublecomplextípusok valamelyikére, akkor a fenti kifejezést a fordítónak (legalábbis tippem szerint) mindenképp kell tudnia értelmezni.SAdam hozzászólása 2009-10-02 20:23-kor
Bocs, most esett le, hogy tul. képp. mit kérdeztél. Szóval a válasz, hogy szeretném, ha a kód lefordulna. Jelenleg, ha csak úgy deklarálom az osztályom, hogy
template <class T> class Matrix { ... };akkor a fordító hibát dob, az előző levelemben ismeretett ok miatt. Szóval, az is jó, ha valaki tud adni egy tippet, hogy mit kell ahhoz csinálni, hogy a fordító "elhigyje" nekem, hogy a
Tosztály csak olyan dolgokból fog kikerülni, amiket valóban lehet összeadni, szorozni, satöbbi. Ha erre van megoldás, akkor persze már nem fogom akarni megszorítani az osztályt, hogy csakdoublevagy__CLPK_doublecomplexalapon lehessen definiálni...UPi hozzászólása 2009-10-02 20:34-kor
Még mindig nem értem, hogy mi a probléma, ugyanis amíg nincs konkrét T, addig a fordító nem fordít neked a template-ből semmit. Vagyis, ha ezt írod:
Magyarán, amíg nem csinálsz valamit, amitől olyan kód fordul, ami helytelen, addig nincs gond a template-tel. Vagyis még mindig nincs okod külön erőfeszítést tenned azért, hogy ne tudd példányosítani a template-et rossz paraméterrel: ezt a fordító megteszi helyetted.
UPi hozzászólása 2009-10-02 20:35-kor
(Válaszképp erre)
Bocs, az előző kommentben
T multiplyByTen() { return _value * 10; }akart lenni..SAdam hozzászólása 2009-10-02 20:38-kor
(Válaszképp erre)
Akkor valamit elb*sztam... Nyüff. Nekifutok megint, és ha még mindig nem megy, akkor jelentkezem megint...
SAdam hozzászólása 2009-10-05 4:14-kor
Na, két napi nekifutás után még mindig nem megy, de legalább kezd fény derengeni...
Szóval addig eljutottam, hogy a template-ekből fordítási időben készülnek el a konkrét osztályok, ezért ha fordítási időben rendelkezésre áll minden, akkor nincs gond, le fog fordulni a program, vagyis nem kell explicit módon megadnom, hogy miből engedem meg létrehozni a konkrét ojjektumot, mert a fordító úgyis jelez, ha hiba van.
Na most a problémám már csak az, hogy hogyan tudok "feltételes fordítást" csinálni annak alapján, hogy milyen típus alapján készült a template? Magyarul, vagy egy rutinom (konkrétan, az a rutin, ami a mátrix sajátértékeit számolja), ami más algoritmust kellene, hogy futtasson akkor, ha a mátrix komplex, mint akkor, ha a mátrix valós. Első blikkre a
dynamic_castparanccsal próbáltam megoldani a dolgot (úgy, hogy az eljárás elején definiáltam egyTtípusú változót, és tesztelem, hogy mivé tudom castolni, és ez alapján egy elágazás szerint csinálom a csinálnivalót), de ez egyrészt csúnya, másrészt valahogy nem akar működni, ugyanis a fordító már fordítási időben közli, hogy nem fog menni a castolás, ezért le sem fordítja a dolgot. Van erre valami szép módszer, hogy külön definiálni tudjam aMatrix<double>és aMatrix<__CLPK_complex>osztályok ugyanolyan nevű (legyen mondjukgetEigenValues()) metódusát?A másik hasonlóan problémás dolog: lehet olyat csinálni, hogy definiáljam az általános
Matrix<T>osztály egy eljárását valamilyenTtípusú paraméterrel, és külön megadhassam azt is, hogyT-től függetlenül egydoubleparaméterre hogyan reagáljon ugyanez az eljárás? Konkrétan valami ilyesmire gondoltam:de ezt a fordító nem akarja megenni, merthogy ha
Téppdouble, akkor nem tudja eldönteni, hogy a két függvény közül melyiket használja. Másrészt viszont nem tudom, hogy tudnám biztosítani, hogy az értékadás operátor mindig működjöndoubleparaméterrel (komplex értékű mátrixot is lehet valós értékkel inicializálni elvégre).SAdam hozzászólása 2009-10-05 4:49-kor
(Válaszképp erre)
UPDATE: Ezt a problémát közben sikerült megoldani, viszont fellépett helyette egy másik: sajnos ha szokásosan kiteszem egy külön fejléc file-ba a definíciókat, akkor a fordító nem találja a fordítandót, ezért muszáj voltam egy file-ba pakolni mindent. Így viszont az a hülye helyzet állt elő, hogy mivel a projektemben több file is include-olja a mátrixomat tartalmazó fejléc file-t, ezért gyönyörű
duplicate symbolhibákat kapok linkeléskor. Tud valaki erre megoldást? (Amúgy fura, hogy ezzel ennyit bénázom, máskor általában fórumokon egész gyorsan fel lehet fogni dolgokat, de valahogy template-ügyben nem sikerül megtalálnom a megfelelő fórumokat, úgy tűnik...)Ha már van neved, akkor lépj be.