Vzemite nalogo 11.1.

Kadar je koda v produkciji in želimo kasneje pregledati ali je med izvajanjem prišlo do napake, se poslužimo shranjevanja informacij o napakah v datoteko (angl. log file(https://en.wikipedia.org/wiki/Logging_(software))) . Pri tej nalogi bomo v ta namen naredili razred Log.

Primer:

int main() { Log(LogType::INFO) << "This is additional message. We can also put multiple << and other types, not just strings e.g. " << 5 << "\n" ; std::vector<std::shared_ptr> students = Student::LoadFromFile("students.csv"); return 0; }

Znotraj datoteke log.txt:

[INFO] This is additional message. We can also put multiple << and other types, not just strings e.g. 5 [ERROR] Unparseable date: "6.12.199a"!

Ustvarite enum class LogType z vrednostmi DEBUG, INFO, WARN in ERROR.
Napišite razred Log, ki ima:
    razredno spremenljivko file (ofstream)
    konstantno razredno spremenljivko fileName (string), ki jo kar nastavite na log.txt
    razredno metodo GetStringLogType(LogType type), ki vrača string za podani LogType.
    konstruktor s parametrom type, ki je tipa LogType. Znotraj konstruktorja odprite datoteko in vanjo zapišite za kateri klic se je šlo, torej npr. Log(LogType::Error) bo v datoteko zapisalo [ERROR]. Pri tem uporabite razredno metodo GetStringLogType.
    destruktor, ki zapre datoteko
    prekrite operator <<, vendar naj bo Log &operator<<(const T &msg). Bodite pozorni na to, da lahko prejmemo sporočilo poljubnega tipa (torej gre za šablono). Znotraj te metode zapišemo v datoteko prejeto sporočilo. Na koncu vrnemo kazalec *this.
Pri metodi LoadFromFile znotraj try-catch bloka, dodajte zapisovanje napake v datoteko v primeru napačnega formata datuma.
Ustvarite še eno izjemo po lastni izbiri in jo uporabite na ustreznih mestih v vaši kodi. Primer naj bo smiseln.
Poiščite še 3 smiselne primere za LogType, da bo v datoteko zapisalo [WARN].
Demonstrirajte delovanje razreda Log in lastne izjeme.