Spicializece sablony – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spicializece sablony – C / C++ – Fórum – Programujte.comSpicializece sablony – C / C++ – Fórum – Programujte.com

 

Jan Kubalek
~ Anonymní uživatel
16 příspěvků
4. 6. 2016   #1
-
0
-

Ahoj,

mam mensi problem se sablonami v C++. Predstavme si, ze mame tridy 

template <typename T, bool FS>
strunct Item {
    T data;
    const bool fs = FS;
};

class Message {
    template <typename T>
    void add(cosnt T&) {
         <neco_pekneho_udelej>
    };
};

A ja bych chtel udelat specializaci Message::add pro Item<A,B>

...
add<Item<T,K>>(const Item<T,K>&) {
    <udelej_neco_opekneho_s_item>
}

Ma nekdo nejaky napda, jak na to?

Diky, honza

Nahlásit jako SPAM
IP: 81.0.216.–
Jan Kubalek
~ Anonymní uživatel
16 příspěvků
4. 6. 2016   #2
-
0
-

PS: specializeci tak, abych mohl zavolat

Message message();
Item<int, true> item;
message.add(item);
Nahlásit jako SPAM
IP: 81.0.216.–
KIIV
~ Moderátor
+43
God of flame
4. 6. 2016   #3
-
0
-

O co se vlastne presne snazis? Trida message, do ktere muzes popridavat parametry ruznych typu?

Nektere veci se daji resit i polymorfizmem - zakladni tridu budes dedit v templatovy tride a bude udavat interface pro ty templatovy. Ale to by jelo jen pokud to bude mit stejny interface (nemuzes pouzivat templatovy parametry u virtualnich metod (ani dovnitr ani ven)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondra.holub+1
Stálý člen
5. 6. 2016   #4
-
0
-

#2 Jan Kubalek
Částečné specializace metod jsou problém. Dá se to obejít tak, že se metoda nespecializuje, ale zavolá se z ní statická metoda z templatované třídy, která už se dá specializovat. Ale není to vůbec hezké:


#include <iostream>

template <typename T, bool FS>
struct Item
{
    T data;
    static const bool fs = FS;
};

class Message
{
    template<typename T>
    class C;

public:
    template <typename T>
    void add(const T&);
};

template<typename T>
class Message::C
{
public:
    static void add(const T& )
    {
        std::cout << "Tady se udela neco pekneho\n";
    }
};

template<typename T, bool K>
class Message::C<Item<T, K> >
{
public:
    static void add(const Item<T, K>& )
    {
        std::cout << "Tady se udela neco s item\n";
    }
};

template<typename T>
void Message::add(const T& value)
{
    C<T>::add(value);
}

int main()
{
    Message message;
    Item<int, true> item;
    message.add(item);
}
Nahlásit jako SPAM
IP: 212.96.189.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 23 hostů

Podobná vlákna

Sablony #2 — založil Gadael

C++ šablony — založil Kenvelo

WebSpell Sablony — založil Alterna

Naprogramovani sablony — založil putti

šablony a ukazatele — založil liamlim

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý