diff options
| Commit | 5e9cb4ddc811465731596d8ee684f3d8cd5a6aea (patch) | |
|---|---|---|
| Author | 2026-05-02 16:05:06 +0300 | |
| Committer | 2026-05-02 16:05:06 +0300 | |
| Files | 33a9268d1136974d2ef138364dde508ba43b4a52 /Week11/Exercise02/Option.hpp | |
| oop-2025-solutions-main.tar oop-2025-solutions-main.tar.gz oop-2025-solutions-main.zip | ||
| Parent | 7546f0d0da487e16f0a8671c09a46e1cee2bc03a (diff) | |
1 files changed, 68 insertions, 0 deletions
| -rw-r--r-- | Week11/Exercise02/Option.hpp | 68 |
diff --git a/Week11/Exercise02/Option.hpp b/Week11/Exercise02/Option.hpp new file mode 100644 index 0000000..69f7297 --- /dev/null +++ b/Week11/Exercise02/Option.hpp @@ -0,0 +1,68 @@ +#ifndef _OPTION +#define _OPTION + +template <class T> +class Option { + T obj; + bool isSomething; + + Option(); +public: + static Option Some(T value); + static Option None(); + + bool IsSome() const; + bool IsNone() const; + T Unwrap(); +}; + +template <class T> +Option<T>::Option() : obj(), isSomething(false) +{ } + +template <class T> +Option<T> Option<T>::Some(T value) { + Option op; + op.isSomething = true; + op.obj = value; + return op; +} + +// Какво запазваме, когато искаме да запазим нищо? +// Ако работехме с T*, щяхме да запазим nullptr. +// В нашия случай, няма голямо значение каква е стойността на obj, +// затова просто ще запазим стойността по подразбиране. +// Ако съответния тип няма конструктор по подразбиране, тогава ще +// получим грешка по време на компилация. +template <class T> +Option<T> Option<T>::None() { + return Option(); +} + +template <class T> +bool Option<T>::IsSome() const { + return isSomething; +} + +template <class T> +bool Option<T>::IsNone() const { + return !isSomething; +} + +// Както при None метода, тук е нужно T да има имплементиран +// копиращи и/или преместващи семантики (конструктор и operator=). +// +// Обаче, ако ние сме създали обект чрез None, тогава Unwrap ще ни +// върне потенциално валидна стойност: тази по подразбиране. +// Коректното решение тук е да имаме проверка за isSomething, +// и ако не е, да "хвърлим грешка". Но това още не сме го учили. +// +// За момента ще приемем, че ако програмист направи Unwrap на обект, +// създаден чрез None, тогава това е негов пропуск, който сам трябва +// да си оправи. +template <class T> +T Option<T>::Unwrap() { + return obj; +} + +#endif /* _OPTION */ |
