#include <string>
#include <iostream>
// ----------------------------------------------
// Declaring typeclass interface, no implementation
// ----------------------------------------------
template <typename T>
class Show
{
public:
static std::string show(T t);
};
// ----------------------------------------------
// Declare some instances via specification
// ----------------------------------------------
template <>
class Show<int>
{
public:
static std::string show(int x)
{
return std::to_string(x); // yep, it's c++11
}
};
template <>
class Show<std::string>
{
public:
static std::string show(std::string s) { return s; }
};
// ----------------------------------------------
// Declaring function that use generic capabilities.
// Let's imagine that << is not overloaded...
// ----------------------------------------------
template <typename T>
void print(T obj)
{
std::cout << Show<T>::show(obj) << std::endl;
}
// ----------------------------------------------
// testing
// ----------------------------------------------
int main()
{
std::string message("Hi there");
print(message);
print(5);
// print("Hello, world"); -- will not compile: no instance of Show
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgogCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVjbGFyaW5nIHR5cGVjbGFzcyBpbnRlcmZhY2UsIG5vIGltcGxlbWVudGF0aW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIFNob3cKewpwdWJsaWM6CiAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2hvdyhUIHQpOwp9OwogCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRGVjbGFyZSBzb21lIGluc3RhbmNlcyB2aWEgc3BlY2lmaWNhdGlvbgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRlbXBsYXRlIDw+CmNsYXNzIFNob3c8aW50Pgp7CnB1YmxpYzoKICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzaG93KGludCB4KQogICAgewogICAgICAgIHJldHVybiBzdGQ6OnRvX3N0cmluZyh4KTsgLy8geWVwLCBpdCdzIGMrKzExCiAgICB9Cn07CiAKdGVtcGxhdGUgPD4KY2xhc3MgU2hvdzxzdGQ6OnN0cmluZz4KewpwdWJsaWM6CiAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2hvdyhzdGQ6OnN0cmluZyBzKSB7IHJldHVybiBzOyB9Cn07CiAKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBEZWNsYXJpbmcgZnVuY3Rpb24gdGhhdCB1c2UgZ2VuZXJpYyBjYXBhYmlsaXRpZXMuCi8vIExldCdzIGltYWdpbmUgdGhhdCA8PCBpcyBub3Qgb3ZlcmxvYWRlZC4uLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHByaW50KFQgb2JqKQp7CiAgICBzdGQ6OmNvdXQgPDwgU2hvdzxUPjo6c2hvdyhvYmopIDw8IHN0ZDo6ZW5kbDsKfQogCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBtYWluKCkKewogICAgc3RkOjpzdHJpbmcgbWVzc2FnZSgiSGkgdGhlcmUiKTsKIAogICAgcHJpbnQobWVzc2FnZSk7CiAgICBwcmludCg1KTsKICAgIC8vIHByaW50KCJIZWxsbywgd29ybGQiKTsgLS0gd2lsbCBub3QgY29tcGlsZTogbm8gaW5zdGFuY2Ugb2YgU2hvdwogICAgcmV0dXJuIDA7Cn0=