#include <iostream>
#include <string>
template< typename t >
struct named_value {
t value;
std::string name;
};
template< typename t >
void _( named_value< t > const &nv ) { // not a good name for a function
std::cout << nv.name; // not a good semantic for a function
}
template< typename t >
std::ostream &operator<< ( std::ostream &s, named_value< t > const &v ) {
return s << v.value;
}
typedef named_value< int > named_int;
void print (named_int p)
{
_(p); std::cout << "=" << p;
}
int main()
{
named_value< int > a = { 1, "a" }, b = { 2, "b" };
_(a);
std::cout << " = " << a;
print(b);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8IHR5cGVuYW1lIHQgPgpzdHJ1Y3QgbmFtZWRfdmFsdWUgewogICAgdCB2YWx1ZTsKICAgIHN0ZDo6c3RyaW5nIG5hbWU7Cn07Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgdCA+CnZvaWQgXyggbmFtZWRfdmFsdWU8IHQgPiBjb25zdCAmbnYgKSB7IC8vIG5vdCBhIGdvb2QgbmFtZSBmb3IgYSBmdW5jdGlvbgogICAgc3RkOjpjb3V0IDw8IG52Lm5hbWU7IC8vIG5vdCBhIGdvb2Qgc2VtYW50aWMgZm9yIGEgZnVuY3Rpb24KfQoKdGVtcGxhdGU8IHR5cGVuYW1lIHQgPgpzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwgKCBzdGQ6Om9zdHJlYW0gJnMsIG5hbWVkX3ZhbHVlPCB0ID4gY29uc3QgJnYgKSB7CiAgICByZXR1cm4gcyA8PCB2LnZhbHVlOwp9Cgp0eXBlZGVmIG5hbWVkX3ZhbHVlPCBpbnQgPiBuYW1lZF9pbnQ7Cgp2b2lkIHByaW50IChuYW1lZF9pbnQgcCkKewogICBfKHApOyBzdGQ6OmNvdXQgPDwgIj0iIDw8IHA7Cn0KCmludCBtYWluKCkKewogICBuYW1lZF92YWx1ZTwgaW50ID4gYSA9IHsgMSwgImEiIH0sIGIgPSB7IDIsICJiIiB9OwogICBfKGEpOyAKICAgc3RkOjpjb3V0IDw8ICIgPSAiIDw8IGE7CiAgIHByaW50KGIpOwp9Cg==