#include <iostream>
#include <sstream>
#include <string>
struct printable
{
template <typename T>
printable(T const* value)
: data_(value), to_string_impl_(&printable::to_string_impl<T>)
{}
std::string to_string() const
{
return to_string_impl_(data_);
}
private:
void const* data_;
std::string (* to_string_impl_) ( void const*);
template <typename T>
static std::string to_string_impl(void const* data)
{
std::ostringstream oss;
oss << *static_cast<T const*>(data);
return oss.str();
}
};
int main()
{
int i = 42;
double d = 3.14;
printable a(&i), b(&d);
std::cout << "i: " << a.to_string() << '\n';
std::cout << "d: " << b.to_string() << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KCnN0cnVjdCBwcmludGFibGUKewoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglwcmludGFibGUoVCBjb25zdCogdmFsdWUpCgkJOiBkYXRhXyh2YWx1ZSksIHRvX3N0cmluZ19pbXBsXygmcHJpbnRhYmxlOjp0b19zdHJpbmdfaW1wbDxUPikKCXt9CgoJc3RkOjpzdHJpbmcgdG9fc3RyaW5nKCkgY29uc3QKCXsKCQlyZXR1cm4gdG9fc3RyaW5nX2ltcGxfKGRhdGFfKTsKCX0KCnByaXZhdGU6Cgl2b2lkIGNvbnN0KiBkYXRhXzsKCXN0ZDo6c3RyaW5nICgqIHRvX3N0cmluZ19pbXBsXykgKCB2b2lkIGNvbnN0Kik7CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CglzdGF0aWMgc3RkOjpzdHJpbmcgdG9fc3RyaW5nX2ltcGwodm9pZCBjb25zdCogZGF0YSkKCXsKCQlzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwoJCW9zcyA8PCAqc3RhdGljX2Nhc3Q8VCBjb25zdCo+KGRhdGEpOwoJCXJldHVybiBvc3Muc3RyKCk7Cgl9Cn07CgppbnQgbWFpbigpCnsKCWludCBpID0gNDI7Cglkb3VibGUgZCA9IDMuMTQ7CgoJcHJpbnRhYmxlIGEoJmkpLCBiKCZkKTsKCglzdGQ6OmNvdXQgPDwgImk6ICIgPDwgYS50b19zdHJpbmcoKSA8PCAnXG4nOwoJc3RkOjpjb3V0IDw8ICJkOiAiIDw8IGIudG9fc3RyaW5nKCkgPDwgJ1xuJzsKfQ==