1. In your tests, how did you test the error handling (e.g., that a wrong string_cast actually throws?) Genom att använda en ogiltig inmatning, som "abc" eller "123abc", och verifiera att std::invalid_argument kastas korrekt. 2. In TagRemover, why do you think the constructor takes an istream instead of just the filename? Det gör klassen mer flexibel eftersom den kan arbeta med vilken ström som helst, inte bara filer. Till exempel kan den användas med std::cin eller std::stringstream. 3. In TagRemover, did you process the file line by line, or did you first read the entire file? What are the pros and cons of these two approaches? Jag läste hela filen först eftersom det är enklare att använda regex för att bearbeta hela texten på en gång. Fördelen är att det är mer effektivt för regex-matchning, men nackdelen är att det kräver mer minne för stora filer. 4. How do you read the entire contents of an std::istream into a std::string without using a for or while loop? Genom att använda: std::string content((std::istreambuf_iterator(istream)), std::istreambuf_iterator()); 5. In TagRemover, do you have duplicate code for translating the special characters? If so, how would you refactor your code to avoid duplicate code? Ja, det finns duplicerad kod för varje specialtecken. Jag skulle använda en std::map för att lagra mönster och ersättningar och iterera genom den: std::map replacements = { {"<", "<"}, {">", ">"}, {" ", " "}, {"&", "&"} }; for (const auto& [pattern, replacement] : replacements) { result = std::regex_replace(result, std::regex(pattern), replacement); } 6. How do you check if an input or output operation on a stream (e.g., operator>> or operator<<) has failed? Genom att använda std::istream::fail() eller std::ostream::fail(). 7. How do you know if you have reached the end of an istream? Genom att använda std::istream::eof(). 8. Does string_cast("123kalle") return the value 123 or does it throw an exception? How do you implement each of those behaviours? Det kastar ett undantag eftersom std::istringstream misslyckas med att konsumera hela strängen. För att tillåta delvis inläsning skulle vi behöva anpassa funktionen. 9. When calling the function template toString, the template type argument is not ex- plicitly given in the call. For string_cast, on the other hand, you have to specify string_cast or string_cast. What is the difference? When should explicit template arguments be given to function templates? toString använder <<-operatören, som automatiskt identifierar typen av objekt, medan string_cast kräver en explicit typ eftersom det behöver veta vad strängen ska konverteras till.