Částečná specializace funkcí šablonové třídy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Částečná specializace funkcí šablonové třídy – C / C++ – Fórum – Programujte.comČástečná specializace funkcí šablonové třídy – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Kowalsky950
Stálý člen
14. 9. 2013   #1
-
0
-

Dobrý den, mám takový problém
 

template <class t,class x>
class trida
{
public: void funkce() {cout<< "funkce1";}
};

template <>
void trida<int,int>::funkce() {cout<< "funkce2";}

template <typename X>
void trida<double,X>::funkce() {cout<< "funkce3";}


Proč mi nelze vytvořit poslední šablona? Píši něco špatně? Jde mi tímto způsobem vytvořit nová třída, tedy jde napsat

template <typename T> 
class trida<double,T>
{
public: void funkce() {cout<< "Funkce4";}
};


ale u funkce mi to nefunguje.

Nahlásit jako SPAM
IP: 90.176.114.–
Reklama
Reklama
Martin Kozibrátka0
Stálý člen
14. 9. 2013   #2
-
0
-

Nemůžete částečně specializovat funkci. Lze ji specializovat pouze úplně.

Fungovat to tedy bude pouze tak, jak jste psal. Musíte vytvořit příslušnou specializaci třídy, přilehlé k oné částečně spec. funkci.

template <class t,class x>
class trida
{
public: void funkce() {cout<< "funkce1";}
};

template <class x>
class trida<x,double>
{
public: void funkce();
};


template <>
void trida<int,int>::funkce() {cout<< "funkce2";}

template <class x>
void trida<x,double>::funkce() {cout<< "funkce3";}


int main()
{
	trida<int, double> s;
	s.funkce();


    return 0;
}
Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Kowalsky950
Stálý člen
14. 9. 2013   #3
-
0
-

jenže to znamená že budu muset všechny funkce znovu přepisovat. Nebo lze ze specializace šablony volat funkce v obecné šabloně?

Nahlásit jako SPAM
IP: 90.176.114.–
Martin Kozibrátka0
Stálý člen
14. 9. 2013   #4
-
+1
-
Zajímavé

Tvůj problém lze vyřešit mnoha způsoby

using namespace std;

template <class t,class x>
class trida
{
public: 
	void funkce(){funkce_tmpl<t>();}

	template<class D>
		void funkce_tmpl() {cout<<"prvni parametr sablony neni double"<<endl;}

	template<>
		void funkce_tmpl<double>() {cout<<"prvni parametr sablony je double"<<endl;}

};

int main()
{
	trida<double, double> s;
	trida<int, double> l;
	s.funkce();
	l.funkce();

    return 0;
}
Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Kowalsky950
Stálý člen
14. 9. 2013   #5
-
+1
-
Zajímavé

To je sice jedna z možností, ale stále to má nějaké omezení. Například to platí jen pro jeden parametr, kdybych měla šablona tři vstupní data a chtěl bych se řídit pouze dvěma (rozdílnýma tak to nepůjde). Škoda že tam není nějaká přímá jazyková podpora :( Když to jde na třídy, mohlo by to fungovat i na funkce :/

Nahlásit jako SPAM
IP: 90.176.114.–
Martin Kozibrátka0
Stálý člen
14. 9. 2013   #6
-
0
-

Ano, máš pravdu, že na tyto druhy specializace bude efektivnější použít šablony tříd

using namespace std;


template <class t,class x,class z>
class trida
{
	template<class Q, class W>
	class trida_tmpl
	{
	public: void operator()(trida *tmp){cout<<"-, -"<<endl;};
	};
	template<class Q>
	class trida_tmpl<Q,Q>
	{
	public:	void operator()(trida *tmp){cout<<"double, double"<<endl;};
	};
	template<class Q, class W>
	class trida_tmpl<Q,W*>
	{
	public:	void operator()(trida *tmp){cout<<"double, double*"<<endl;};
	};
public: 
	void funkce(){trida_tmpl<t,x>().operator()(this);}
};

int main()
{
	trida<double, double*,int> s;
	trida<int, double,int> l;
	trida<double, int,int> k;
	trida<double, double,int> w;
	s.funkce();
	l.funkce();
	k.funkce();
	w.funkce();

    return 0;
}
Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
Martin Kozibrátka0
Stálý člen
16. 9. 2013   #7
-
0
-

 Ještě bych doplnil, že bychom neměli zapomínat na přetěžování funkcí, se kterými se to může zdát jednodušší. ;)

template <class t,class x,class z>
class trida
{
	template<class T,class U>
	void funkce_tmpl(T,U){cout<<"-, -"<<endl;};

	template<class T,class U>
	void funkce_tmpl(T,T){cout<<"double, double"<<endl;};

	template<class T,class U>
	void funkce_tmpl(T,T*){cout<<"double, double*"<<endl;};

public: 
	void funkce(){funkce_tmpl<t,x>(t(),x());}
};

int main()
{
	trida<double, double*,int> s;
	trida<int, double,int> l;
	trida<double, int,int> k;
	trida<double, double,int> w;
	s.funkce();
	l.funkce();
	k.funkce();
	w.funkce();

    return 0;
}
Nahlásit jako SPAM
IP: 88.83.169.–
Savana.cz - neomezený webhosting za pár kaček :)
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, 74 hostů

Moderátoři diskuze

 

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