#include <iostream>
#include <string>
using namespace std;
template<typename T>
class counted_type {
static size_t counter;
protected:
counted_type(){}
static size_t next_id() {
return counter += 1;
}
public:
size_t id = next_id();
};
template<typename T>
size_t counted_type<T>::counter = 0;
class person: public counted_type<person> {
using counted_type<person>::id;
string first_name, last_name;
public:
person(string const &fname, string const &lname):
first_name(fname), last_name(lname){}
string to_string() const {
return first_name + ", " + last_name + ", " + std::to_string(id);
}
};
class fruit: public counted_type<fruit> {
using counted_type<fruit>::id;
string kind;
public:
fruit(string const &kind): kind(kind){}
string to_string() const {
return kind + ", " + std::to_string(id);
}
};
int main() {
person people[] = {
person("John", "Travolta"),
person("Rocky", "Balboa"),
person("Rick", "Grimes")
};
for(const auto &p: people) {
cout << p.to_string() << endl;
}
fruit fruits[] = {
fruit("banana"),
fruit("apple"),
fruit("peach")
};
for(const auto &f: fruits) {
cout << f.to_string() << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgY291bnRlZF90eXBlIHsKCXN0YXRpYyBzaXplX3QgY291bnRlcjsKcHJvdGVjdGVkOgoJY291bnRlZF90eXBlKCl7fQoJc3RhdGljIHNpemVfdCBuZXh0X2lkKCkgewoJCXJldHVybiBjb3VudGVyICs9IDE7Cgl9CnB1YmxpYzoKCXNpemVfdCBpZCA9IG5leHRfaWQoKTsKCQp9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzaXplX3QgY291bnRlZF90eXBlPFQ+Ojpjb3VudGVyID0gMDsKCmNsYXNzIHBlcnNvbjogcHVibGljIGNvdW50ZWRfdHlwZTxwZXJzb24+IHsKCXVzaW5nIGNvdW50ZWRfdHlwZTxwZXJzb24+OjppZDsKCglzdHJpbmcgZmlyc3RfbmFtZSwgbGFzdF9uYW1lOwpwdWJsaWM6CgoJcGVyc29uKHN0cmluZyBjb25zdCAmZm5hbWUsIHN0cmluZyBjb25zdCAmbG5hbWUpOgoJCWZpcnN0X25hbWUoZm5hbWUpLCBsYXN0X25hbWUobG5hbWUpe30KCQkKCXN0cmluZyB0b19zdHJpbmcoKSBjb25zdCB7CgkJcmV0dXJuIGZpcnN0X25hbWUgKyAiLCAiICsgbGFzdF9uYW1lICsgIiwgIiArIHN0ZDo6dG9fc3RyaW5nKGlkKTsKCX0KfTsKCmNsYXNzIGZydWl0OiBwdWJsaWMgY291bnRlZF90eXBlPGZydWl0PiB7Cgl1c2luZyBjb3VudGVkX3R5cGU8ZnJ1aXQ+OjppZDsKCQoJc3RyaW5nIGtpbmQ7CnB1YmxpYzoKCWZydWl0KHN0cmluZyBjb25zdCAma2luZCk6IGtpbmQoa2luZCl7fQoKCXN0cmluZyB0b19zdHJpbmcoKSBjb25zdCB7CgkJcmV0dXJuIGtpbmQgKyAiLCAiICsgc3RkOjp0b19zdHJpbmcoaWQpOwoJfQp9OwoKaW50IG1haW4oKSB7CglwZXJzb24gcGVvcGxlW10gPSB7CgkJcGVyc29uKCJKb2huIiwgIlRyYXZvbHRhIiksCgkJcGVyc29uKCJSb2NreSIsICJCYWxib2EiKSwKCQlwZXJzb24oIlJpY2siLCAiR3JpbWVzIikKCX07CgkKCWZvcihjb25zdCBhdXRvICZwOiBwZW9wbGUpIHsKCQljb3V0IDw8IHAudG9fc3RyaW5nKCkgPDwgZW5kbDsKCX0KCQoJZnJ1aXQgZnJ1aXRzW10gPSB7CgkJZnJ1aXQoImJhbmFuYSIpLAoJCWZydWl0KCJhcHBsZSIpLAoJCWZydWl0KCJwZWFjaCIpCgl9OwoJCglmb3IoY29uc3QgYXV0byAmZjogZnJ1aXRzKSB7CgkJY291dCA8PCBmLnRvX3N0cmluZygpIDw8IGVuZGw7Cgl9CgkKCXJldHVybiAwOwp9
John, Travolta, 1
Rocky, Balboa, 2
Rick, Grimes, 3
banana, 1
apple, 2
peach, 3