finished seminar04
parent
edf2094701
commit
094a022df8
@ -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 New Issue