#include <map>
#include <string>
struct referent_compare {
template< typename t >
bool operator () ( t *lhs, t *rhs )
{ return * lhs < * rhs; }
};
template< typename t >
t const *temp_ptr( t const &o ) { return &o; }
struct s {
std::string name;
long birthdate;
double score;
};
std::map< std::string const *, s, referent_compare > byname;
std::map< double const *, s, referent_compare > byscore;
int main() {
s bob = { "bob", 12000000, 96.3 };
byname.insert( std::make_pair( & bob.name, bob ) );
byscore.insert( std::make_pair( & bob.score, bob ) );
byname[ temp_ptr< std::string >( "bob" ) ].score = 33.1;
}
I2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KCnN0cnVjdCByZWZlcmVudF9jb21wYXJlIHsKICAgIHRlbXBsYXRlPCB0eXBlbmFtZSB0ID4KICAgIGJvb2wgb3BlcmF0b3IgKCkgKCB0ICpsaHMsIHQgKnJocyApCiAgICAgICAgeyByZXR1cm4gKiBsaHMgPCAqIHJoczsgfQp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIHQgPgp0IGNvbnN0ICp0ZW1wX3B0ciggdCBjb25zdCAmbyApIHsgcmV0dXJuICZvOyB9CgpzdHJ1Y3QgcyB7CiAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgbG9uZyBiaXJ0aGRhdGU7CiAgICBkb3VibGUgc2NvcmU7Cn07CgpzdGQ6Om1hcDwgc3RkOjpzdHJpbmcgY29uc3QgKiwgcywgcmVmZXJlbnRfY29tcGFyZSA+IGJ5bmFtZTsKc3RkOjptYXA8IGRvdWJsZSBjb25zdCAqLCBzLCByZWZlcmVudF9jb21wYXJlID4gYnlzY29yZTsKCmludCBtYWluKCkgewogICAgcyBib2IgPSB7ICJib2IiLCAxMjAwMDAwMCwgOTYuMyB9OwogICAgYnluYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoICYgYm9iLm5hbWUsIGJvYiApICk7CiAgICBieXNjb3JlLmluc2VydCggc3RkOjptYWtlX3BhaXIoICYgYm9iLnNjb3JlLCBib2IgKSApOwogICAgCiAgICBieW5hbWVbIHRlbXBfcHRyPCBzdGQ6OnN0cmluZyA+KCAiYm9iIiApIF0uc2NvcmUgPSAzMy4xOwp9Cg==