Professional Documents
Culture Documents
Programare Orientata Pe Obiecte: Curs 10 - Template
Programare Orientata Pe Obiecte: Curs 10 - Template
Curs 10 – Template
C
++{};
C++ Acest curs
› std::type_info
› auto
› Functii template
› Clase template
C++ std::type_info
› class type_info;
› Retine informatii despre un tip de date
› Clasa nu poate fi instantiata
› Member functions:
operator== Compare types(public member function)
operator!= Compare types(public member function)
before Compare order of types(public member function)
name Get type name(public member function)
hash_code Get type hash code(public member function)
C++ std::type_info
int x = 10;
cout << "typeid(x): " << typeid(x).name() << endl;
typeid(x): i
typeid(int): i
C++ std::type_info
class Base {}; // non-polymorphic
class Derived : Base {};
Base y;
cout << "typeid(Base):" << typeid(y).name() << endl;
Base2 z;
cout << "typeid(Base2):" << typeid(z).name() << endl;
Derived2 d;
cout << "typeid(Derived2):" << typeid(d).name() << “ and hash_code(): " <<
typeid(d).hash_code() << endl;
typeid(Base):Base
typeid(Base2):Base2
typeid(Derived2):Derived2 and hash_code(): 17576452764993780389
C++ auto
› Deducerea automata a tipului de date a unei expresii intr-un
limbaj de programare (disponibil cu C++11).
int main()
{
auto x = 4;
auto y = 3.37;
auto ptr = &x; i
cout << typeid(x).name() << endl D
<< typeid(y).name() << endl Pi
<< typeid(ptr).name() << endl;
return 0;
}
C++ auto
› auto devine in tip de date chiar daca o functie intoarce o
referinta catre acel tip de date
// functie ce returneaza o referinta catre tipul int
int& fun() { … }
a, b, c, d, e, f, g, h, i, j,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
double a[10];
float b[10];
int c[10];
// ...
double sa = sum1(a, 10); // OK
float sb = sum1(b, 10); // OK
int sc = sum1(c, 10); // OK
C++ Introducere
› Template-urile (şabloane) furnizează suport pentru programare generică
utilizând tipurile de date ca parametri
› Mecanismul template al limbajului C++ permite ca un tip de date sau o
valoare să fie un parametru în definirea unei clase, funcţii sau alias.
› Template-urile furnizează o cale directă de a reprezenta o gamă largă de
concepte generale şi căi simple de a le combina.
› Rezultatul din punct de vedere al claselor şi funcţiilor poate fi un cod mai
puţin general la run-time şi eficient din punct de vedere al spaţiului.
› Template-urile au fost introduse având ca scop proiectarea, implementarea
şi utilizarea librăriei standard.
› Librăria standard cere un mare grad de generalitate, flexibilitate şi eficienţă.
C++ Introducere
› În consecinţă, tehnicile care pot fi utilizate în proiectarea şi implementarea
libăriei standard sunt eficace şi eficiente în proiectarea soluţiilor pentru o
mare varietate de probleme.
› Aceste tehnici permit unui programator să ascundă implementări sofisticate
în spatele unei simple interfeţe şi să expună complexitatea utilizatorului
atunci când acesta are nevoie şi cere acest lucru.
C++ Un simplu template string
› Se consideră un şir de caractere definit ca o clasă ce memorează caractere
şi furnizează operaţii precum cautare, comparare, concaternare.
› Se doreşte ca acest comportament să poate fi aplicat mai multor tipuri de
carcatere: char, unsigned char, caractere chinezeşti, caractere greceşti etc.
› Cu alte cuvinte se doreşte reprezentarea noiţiunii de „şir de caractere” cu o
dependeţă cât mai mică de un specific tip de caracter
C++ String template
› Fie clasa String:
class String
{
char *ptr;
int sz;
public:
String() : sz(0), ptr(0) {};
explicit String(const char*p);
String(const String&);
char& operator[](int n) { return ptr[n]; }
String& operator+=(char c);
String& operator=(const String&);
˜String() { if (ptr) delete[] ptr; }
};
String<jchar> js;
template<typename T>
String<T>& String<T>::operator+=(T c)
{
// ... concaternare
return ∗this;
}
C++ Definirea unui template
› Parametrul template T este un parametru şi nu un nume pentru un tip
specific. În domeniul String<T>, identificatorul <T> este numele template-
ului. Astfel numele constructorului este String<T>::String.
› Nu este posibilă supraîncărcarea numelui unei clase template.
template<typename T>
class String { /* ... */ };
void f(void)
{
String<jchar> js;
cs = ”Abcd efg hgi";
}
int main(void)
{
A<char, char> a;
A<int, double> b;
return 0;
}
C++ Pot exista argumente predefinite pentru template
#include<iostream>
using namespace std;
int main(void)
{
A<char> a; // Apel constructor ce apartine clasei
// A<char, char>
return 0;
}
C++ We can pass non-type arguments to templates
template <class T, int max>
int arrMin(T arr[], int n)
{
int m = max;
for (int i = 0; i < n; i++)
if (arr[i] < m)
m = arr[i];
return m;
}
int main()
{
int arr1[] = {10, 20, 15, 12};
int n1 = sizeof(arr1)/sizeof(arr1[0]);
template<class T>
int Test<T>::count = 0;
int main()
{
Test<int> a; // valoarea count pentru Test<int> este 1
Test<int> b; // valoarea count pentru Test<int> este 2
Test<double> c; // valoarea count pentru Test<double> este 1
cout << Test<int>::count << endl; // tipareste 2
cout << Test<double>::count << endl; // tipareste 1
return 0;
}
C++ Template specialization
template <class T>
void fun(T a)
{
cout << "The main template fun(): " << a << endl;
}
template<>
void fun(int a)
{
cout << "Specialized Template for int type: " << a << endl;
}
int main()
{
fun<char>('a');
fun<int>(10);
fun<float>(10.14);
}
C++ Template specialization
#include <iostream>
using namespace std;
int main()
{
Test<int> a;
Test<char> b;
Test<float> c;
return 0;
}
C++ Derivare
template<typename T>
class B
{
/* ... */
};
template<typename T>
class D : public B<T>
{
/* ... */
};