diff --git a/seminar04_templates/08_ref/main.cpp b/seminar04_templates/08_ref/main.cpp new file mode 100644 index 0000000..1f9f0f9 --- /dev/null +++ b/seminar04_templates/08_ref/main.cpp @@ -0,0 +1,74 @@ +#include +#include +#include + +using std::cout, std::endl, std::string, std::vector; + +template +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 + friend std::ostream& operator<<(std::ostream& out, Ref r); +}; + +template +std::ostream& operator<<(std::ostream& out, Ref r) { + out << *(r.mPtr); + return out; +} + +void toUpper(Ref r) { + for(size_t i = 0; i < r->size(); ++i) + r.get()[i] = toupper(r.get()[i]); +} + +int main() { + int a = 10; + Ref ra = a; + cout << ra << endl; + + string s = "Cat"; + Ref rs = s; + rs = "Mouse"; + rs += "Elephant"; + cout << rs << endl; + cout << s << endl; + + toUpper(s); + cout << s << endl; + + vector animals {"Cat", "Dogs", "Elephants", "Worms"}; + vector> refs {animals.begin(), animals.end()}; + + for (int i = 0; i < refs.size(); ++i) + cout << animals[i] << " "; + cout << endl; +}