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

šablony a ukazatele – C / C++ – Fórum – Programujte.comšablony a ukazatele – C / C++ – Fórum – Programujte.com

 

liamlim0
Newbie
14. 9. 2014   #1
-
0
-

Dobrý večer přeji

Ještě před nedávnem jsem šablony absolutně neovládal. Nyní alespoň už trochu tuším o co se jedná. Prosím o drobné posunutí mého poznání osvětlením tohoto:
 

#include <iostream>

template<typename T> void zobraz(const T &);

int main()
{
	auto prom_int = 7;
	auto prom_long = 7L;
	auto prom_p_int = &prom_int;

	zobraz(prom_int);
	zobraz(prom_long);
	zobraz(prom_p_int);
	return 0;
}

template<typename T> void zobraz(const T & ob)
{
	std::cout << ob << " " << sizeof ob << std::endl;
}

U tohoto jsem se chtěl přesvědčit, že auto dělá co má, ale to není podstatné. Problémem u mě je to, že jsem se snažil vytvořit novou šablonu pro zobraz. Něco ve stylu 

  

template<typename T> void zobraz(const T * p_ob)
{
	std::cout << p_ob << " " << *p_ob; 
	std::cout << " " << sizeof *p_ob << std::endl;
}


Moje představa byla, že se pozná, že se při volání zobraz(prom_p_int) pozná, že se jedná o ukazatel a použije se druhá šablona. To jak jsem si všiml se neděje, prosím tedy o odpovědi na tyto otázky:

1)  byla by vůbec někdy použita "nová" šablona?
2) lze nějak zařídit, aby pro libovolný ukazatel byla použita jedna šablona a pokud se o ukazatel nejedná, pak druhá?

pozn.: Jsem ve všem začátečník, doufám proto že jsem dotaz zformuloval srozumitelně. Každopádně díky za každou odpověď

Nahlásit jako SPAM
IP: 93.99.200.–
KIIV
~ Moderátor
+43
God of flame
14. 9. 2014   #2
-
0
-

Normálně zobrazíš jen adresu pointeru.

Pokud chceš obsah, tak musíš použít dereferenci ve volání zobraz.

Případně asi explicitní specializace.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liamlim0
Newbie
14. 9. 2014   #3
-
0
-

#2 KIIV
Díky za odpověď.

Pokud bych ve volání na zobraz použil dereferenci pak by se normálně použila první šablona. Ta druhá, která byla zamýšlená pro ukazatele (a která obsahuje zároveň zobrazení adresy a dereferencovaného pointeru) by se stejně nepoužila.

Ten dotaz byl původně myšlen takto. Zmíněná explicitní specializace možná problém řeší, ale neznám ji ještě. Alespoň už vím co se mám teď chvíli učit.

Nahlásit jako SPAM
IP: 93.99.200.–
vitamin+8
Grafoman
15. 9. 2014   #4
-
0
-

Instancivanie templatov funguje nasledovne:

//mas template funkcie:

template<typename T> 
void zobraz(const T& );

template<typename T> 
void zobraz(const T* );
//Ak zavolas funkciu zobraz s mutable value premennou:
int i;

fnc(i); 
//tak sa vygeneruju nasledovne funkcie:
void zobraz(const int&);        //1
void zobraz(/*error*/);	        //2: tato funkica sa zahodi vdaka SFINAE

//zavola sa funkcia 1.

//Ak zavolas funkciu zobraz z mutable pointerom:
int i;

zobraz(&i);    

//vygeneruju sa tieto 2 funkcie:
void zobraz(const int*&); 	//1
void zobraz(const int* );	//2

//obe funkcie akceptuju typ int* po pretypovani na const int*, ale funkcia 1 ho bere ako refrenciu, cize ma vyzsiu prioritu pri overloadingu.
//Ak zavolas funkciu s const pointrom:
const int i;

zobraz(&i);
//vygeneruju sa nasledovne funkcie:
zobraz(const int*&);	//1
zobraz(const int*);	//2

//obe funkcie sa mozu pouzit, ale funkcia 2. akceptuje parameter &i typu const int* BEZ PRETYPOVANIA, cize ma vyzsiu prioritu ako funkcia 1.

Ak chces aby sa pre pointre vzdy volala 1 funkcia a pre ostatne hodnoty druha, tak potrebujes parametre bez const:

template<typename T> 
void zobraz(T*);

template<typename T> 
void zobraz(T&&);	//akceptuje referencie a rvalue referencie (vyzaduje c++11/c++14)

//obe funkcie akceptuju aj const parametre!


//pripadne mozes spravyt overloading vsetkych 4 verzii:

template<typename T> 
void zobraz(T*);

template<typename T> 
void zobraz(const T*);

template<typename T> 
void zobraz(T&);

template<typename T> 
void zobraz(const T&);
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
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, 7 hostů

Podobná vlákna

C++ šablony — založil Kenvelo

Sablony #2 — založil Gadael

WebSpell Sablony — založil Alterna

Naprogramovani sablony — založil putti

Exportování šablony — založil ONDRA

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ý