====== 4 - Šablony funkcí a tříd ======
===== Šablona funkce =====
#include
template T mymax (T a, T b)
{
return (a > b) ? a : b;
}
int main ()
{
std::cout << mymax(10,3) << std::endl;
std::cout << mymax(2.0, 3.14) << std::endl;
std::cout << mymax('a', 'e') << std::endl;
// co se porovnava u stringu?
std::cout << mymax("a", "e") << std::endl;
return 0;
}
===== Šablona třídy - zásobník =====
template Stack
{
private:
T* items;
int stackPointer;
public:
Stack(int max = 100)
{
items = new T[max];
stackPointer = 0;
}
void Push(T x)
{
items[stackPointer++] = x;
}
T Pop()
{
return items[--stackPointer];
}
};
===== Šablona třídy - pole =====
#include
using namespace std;
template
class Array {
T * array_data;
int array_size;
public:
Array (int size = 10);
~Array ();
Array (const Array & src);
int size() const { return array_size; }
Array & operator = (const Array & src);
T & operator [] (int idx);
const T & operator [] (int idx) const;
};
template
Array::Array (int size) {
array_size = size;
array_data = new T [array_size];
}
template
Array::~Array ( ) {
delete [] array_data;
}
template
Array::Array (const Array & src ) {
array_size = src.array_size;
array_data = new T[array_size];
for (int i = 0; i < array_size; i++)
array_data[i] = src.array_data[i];
}
template
Array & Array::operator = (const Array & src) {
if (this != &src) {
delete [] array_data;
array_size = src.array_size;
array_data = new T[array_size];
for (int i = 0; i < array_size; i++)
array_data[i] = src.array_data[i];
}
return *this;
}
template
T & Array::operator [] (int idx) {
if (idx < 0 || idx >= array_size)
throw "Spatny index";
return array_data[idx];
}
template
const T & Array::operator [] (int idx) const {
if (idx < 0 || idx >= array_size)
throw "Spatny index";
return array_data[idx];
}
template
ostream & operator<< (ostream & o, const Array & x) {
for (int i = 0; i < x.size (); i++)
o << x[i] << ' ';
return o;
}
int main () {
Array a (5);
for (int i = 0; i < a.size (); i++) a[i] = i;
cout << "array a: " << a << endl; // [0 1 2 3 4]
Array b = a;
b[1] = 10;
cout << "array a: " << a << endl; // [0 1 2 3 4]
cout << "array b: " << b << endl; // [0 10 2 3 4]
Array c (5);
c[1] = 20;
cout << "array c: " << c << endl; // [? 20 ? ? ?]
Array d = c;
d[2] = 30;
cout << "array d: " << d << endl; // [? 20 30 ? ?]
return 0;
}