Compare commits
2 commits
feef44db4d
...
094a022df8
Author | SHA1 | Date | |
---|---|---|---|
|
094a022df8 | ||
|
edf2094701 |
2 changed files with 116 additions and 0 deletions
42
seminar04_templates/07_manager/main.cpp
Normal file
42
seminar04_templates/07_manager/main.cpp
Normal file
|
@ -0,0 +1,42 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
template <typename T>
|
||||
class Manager {
|
||||
private:
|
||||
T* mPtr;
|
||||
public:
|
||||
Manager() {
|
||||
mPtr = nullptr;
|
||||
}
|
||||
void allocate() {
|
||||
mPtr = (T*)malloc(sizeof(T));
|
||||
}
|
||||
void construct(const T& t) {
|
||||
new(mPtr) T{t};
|
||||
}
|
||||
T& get() {
|
||||
return *mPtr;
|
||||
}
|
||||
void destruct() {
|
||||
mPtr->~T();
|
||||
}
|
||||
void deallocate() {
|
||||
free(mPtr);
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
Manager<std::string> a;
|
||||
a.allocate();
|
||||
a.construct("Cats and dogs");
|
||||
a.get() += " and elephants";
|
||||
std::cout << a.get() << std::endl;
|
||||
a.destruct();
|
||||
|
||||
a.construct("Sapere aude");
|
||||
std::cout << a.get() << std::endl;
|
||||
|
||||
a.destruct();
|
||||
a.deallocate();
|
||||
}
|
74
seminar04_templates/08_ref/main.cpp
Normal file
74
seminar04_templates/08_ref/main.cpp
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
using std::cout, std::endl, std::string, std::vector;
|
||||
|
||||
template <typename T>
|
||||
class Ref {
|
||||
private:
|
||||
T* mPtr;
|
||||
public:
|
||||
Ref(T& t) {
|
||||
mPtr = &t;
|
||||
}
|
||||
Ref(Ref& t) {
|
||||
mPtr = t.mPtr;
|
||||
}
|
||||
Ref() {
|
||||
mPtr = nullptr;
|
||||
}
|
||||
T& get() {
|
||||
return *mPtr;
|
||||
}
|
||||
T operator=(const T& t) {
|
||||
new(mPtr) T{t};
|
||||
return *mPtr;
|
||||
}
|
||||
T operator+(const T& t) {
|
||||
return *mPtr + t;
|
||||
}
|
||||
T operator+=(const T& t) {
|
||||
*mPtr = *mPtr + t;
|
||||
return *mPtr;
|
||||
}
|
||||
T* operator->() {
|
||||
return mPtr;
|
||||
}
|
||||
template <typename U>
|
||||
friend std::ostream& operator<<(std::ostream& out, Ref<U> r);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
std::ostream& operator<<(std::ostream& out, Ref<T> r) {
|
||||
out << *(r.mPtr);
|
||||
return out;
|
||||
}
|
||||
|
||||
void toUpper(Ref<string> r) {
|
||||
for(size_t i = 0; i < r->size(); ++i)
|
||||
r.get()[i] = toupper(r.get()[i]);
|
||||
}
|
||||
|
||||
int main() {
|
||||
int a = 10;
|
||||
Ref<int> ra = a;
|
||||
cout << ra << endl;
|
||||
|
||||
string s = "Cat";
|
||||
Ref<string> rs = s;
|
||||
rs = "Mouse";
|
||||
rs += "Elephant";
|
||||
cout << rs << endl;
|
||||
cout << s << endl;
|
||||
|
||||
toUpper(s);
|
||||
cout << s << endl;
|
||||
|
||||
vector<string> animals {"Cat", "Dogs", "Elephants", "Worms"};
|
||||
vector<Ref<string>> refs {animals.begin(), animals.end()};
|
||||
|
||||
for (int i = 0; i < refs.size(); ++i)
|
||||
cout << animals[i] << " ";
|
||||
cout << endl;
|
||||
}
|
Reference in a new issue