#include <iostream>
#include <map>
#include <string>
struct PlayerClass
{
std::string const name;
unsigned Str, Dex, Int;
PlayerClass( std::string const& name ):
name{name} {}
PlayerClass& operator=(PlayerClass const&) = delete; // Keine Zuweisung (geht sowieso nicht)
};
#include <vector>
#include <algorithm>
#include <functional>
#include <stdexcept>
std::istream& operator>>( std::istream& is, PlayerClass& plcl )
{
static std::vector<std::ctype_base::mask> equals_mask;
if( equals_mask.empty() )
{
equals_mask.assign( std::ctype<char>::classic_table(), std::ctype<char>::classic_table() + std::ctype<char>::table_size);
equals_mask['='] |= std::ctype_base::space;
}
auto old_loc = is.imbue( std::locale{is.getloc(), new std::ctype<char>{equals_mask.data()} } );
std::string attr_str;
unsigned attr_val;
while( is >> attr_str >> attr_val )
{
std::transform( std::begin(attr_str), std::end(attr_str), std::begin(attr_str), std::bind( std::tolower<char>, std::placeholders::_1, old_loc ) ); /// Den String komplett ohne Großbuchstaben machen
if( attr_str == "str" ) plcl.Str = attr_val;
else if( attr_str == "dex" ) plcl.Dex = attr_val;
else if( attr_str == "int" ) plcl.Int = attr_val;
else
throw std::logic_error("Invalid attribute while parsing PlayerClass!");
}
is.imbue( old_loc );
return is;
}
#include <sstream>
int main()
{
std::istringstream stream("Str=12 \n Dex=17 \n Int=4");
PlayerClass test("Schurke");
stream >> test;
std::cout << "Str: " << test.Str << " Dex: " << test.Dex << " Int: " << test.Int;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IFBsYXllckNsYXNzCnsKICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG5hbWU7CgogICAgdW5zaWduZWQgU3RyLCBEZXgsIEludDsKCiAgICBQbGF5ZXJDbGFzcyggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKToKICAgICAgICBuYW1le25hbWV9IHt9CgogICAgUGxheWVyQ2xhc3MmIG9wZXJhdG9yPShQbGF5ZXJDbGFzcyBjb25zdCYpID0gZGVsZXRlOyAvLyBLZWluZSBadXdlaXN1bmcgKGdlaHQgc293aWVzbyBuaWNodCkKfTsKCiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8c3RkZXhjZXB0PgoKc3RkOjppc3RyZWFtJiBvcGVyYXRvcj4+KCBzdGQ6OmlzdHJlYW0mIGlzLCBQbGF5ZXJDbGFzcyYgcGxjbCApCnsKICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OmN0eXBlX2Jhc2U6Om1hc2s+IGVxdWFsc19tYXNrOwogICAgaWYoIGVxdWFsc19tYXNrLmVtcHR5KCkgKQogICAgewogICAgICAgIGVxdWFsc19tYXNrLmFzc2lnbiggc3RkOjpjdHlwZTxjaGFyPjo6Y2xhc3NpY190YWJsZSgpLCBzdGQ6OmN0eXBlPGNoYXI+OjpjbGFzc2ljX3RhYmxlKCkgKyBzdGQ6OmN0eXBlPGNoYXI+Ojp0YWJsZV9zaXplKTsKICAgICAgICBlcXVhbHNfbWFza1snPSddIHw9IHN0ZDo6Y3R5cGVfYmFzZTo6c3BhY2U7CiAgICB9CgogICAgYXV0byBvbGRfbG9jID0gaXMuaW1idWUoIHN0ZDo6bG9jYWxle2lzLmdldGxvYygpLCBuZXcgc3RkOjpjdHlwZTxjaGFyPntlcXVhbHNfbWFzay5kYXRhKCl9IH0gKTsKCiAgICBzdGQ6OnN0cmluZyBhdHRyX3N0cjsKICAgIHVuc2lnbmVkIGF0dHJfdmFsOwogICAgd2hpbGUoIGlzID4+IGF0dHJfc3RyID4+IGF0dHJfdmFsICkKICAgIHsKICAgICAgICBzdGQ6OnRyYW5zZm9ybSggc3RkOjpiZWdpbihhdHRyX3N0ciksIHN0ZDo6ZW5kKGF0dHJfc3RyKSwgc3RkOjpiZWdpbihhdHRyX3N0ciksIHN0ZDo6YmluZCggc3RkOjp0b2xvd2VyPGNoYXI+LCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEsIG9sZF9sb2MgKSApOyAvLy8gRGVuIFN0cmluZyBrb21wbGV0dCBvaG5lIEdyb8OfYnVjaHN0YWJlbiBtYWNoZW4KCiAgICAgICAgICAgICBpZiggYXR0cl9zdHIgPT0gInN0ciIgKSBwbGNsLlN0ciA9IGF0dHJfdmFsOwogICAgICAgIGVsc2UgaWYoIGF0dHJfc3RyID09ICJkZXgiICkgcGxjbC5EZXggPSBhdHRyX3ZhbDsKICAgICAgICBlbHNlIGlmKCBhdHRyX3N0ciA9PSAiaW50IiApIHBsY2wuSW50ID0gYXR0cl92YWw7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGF0dHJpYnV0ZSB3aGlsZSBwYXJzaW5nIFBsYXllckNsYXNzISIpOwogICAgfQoKICAgIGlzLmltYnVlKCBvbGRfbG9jICk7CgogICAgcmV0dXJuIGlzOwp9CgojaW5jbHVkZSA8c3N0cmVhbT4KCmludCBtYWluKCkKewogICAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cmVhbSgiU3RyPTEyIFxuIERleD0xNyBcbiBJbnQ9NCIpOwogICAgUGxheWVyQ2xhc3MgdGVzdCgiU2NodXJrZSIpOwogICAgc3RyZWFtID4+IHRlc3Q7CgogICAgc3RkOjpjb3V0IDw8ICJTdHI6ICIgPDwgdGVzdC5TdHIgPDwgIiBEZXg6ICIgPDwgdGVzdC5EZXggPDwgIiBJbnQ6ICIgPDwgdGVzdC5JbnQ7Cn0KCg==