62 lines
2.7 KiB
Text
62 lines
2.7 KiB
Text
|
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<char>(istream)), std::istreambuf_iterator<char>());
|
||
|
|
||
|
|
||
|
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<std::string, std::string> 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<int>("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<int> or string_cast<Date>. 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.
|