#include <iostream>
#include <cstdio>
//lets define few policy classes
struct cout_print_policy
{
template<typename T>
static void print(T const & data)
{
std::cout << "printing using cout = " << data << std::endl;
}
};
struct printf_print_policy
{
static void print(int data)
{
std::printf("printing int using printf = %d\n", data);
}
static void print(double data)
{
std::printf("printing double using printf = %f\n", data);
}
};
//now define the class template (called host class) that
//accepts policy as template argument
template<typename T, typename TPrintPolicy>
class host
{
typedef TPrintPolicy print_policy;
T data;
public:
host(T const & d) : data(d) {}
void print()
{
print_policy::print(data);
}
};
//test code
int main()
{
host<int, cout_print_policy> ic(100);
host<double, cout_print_policy> dc(100.0);
host<int, printf_print_policy> ip(100);
host<double, printf_print_policy> dp(100.0);
ic.print();
dc.print();
ip.print();
dp.print();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgoKLy9sZXRzIGRlZmluZSBmZXcgcG9saWN5IGNsYXNzZXMKc3RydWN0IGNvdXRfcHJpbnRfcG9saWN5CnsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBzdGF0aWMgdm9pZCBwcmludChUIGNvbnN0ICYgZGF0YSkKICAgIHsKICAgICAgIHN0ZDo6Y291dCA8PCAicHJpbnRpbmcgdXNpbmcgY291dCA9ICIgPDwgZGF0YSA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgpzdHJ1Y3QgcHJpbnRmX3ByaW50X3BvbGljeQp7CiAgICBzdGF0aWMgdm9pZCBwcmludChpbnQgZGF0YSkKICAgIHsKICAgICAgIHN0ZDo6cHJpbnRmKCJwcmludGluZyBpbnQgdXNpbmcgcHJpbnRmID0gJWRcbiIsIGRhdGEpOwogICAgfQogICAgc3RhdGljIHZvaWQgcHJpbnQoZG91YmxlIGRhdGEpCiAgICB7CiAgICAgICBzdGQ6OnByaW50ZigicHJpbnRpbmcgZG91YmxlIHVzaW5nIHByaW50ZiA9ICVmXG4iLCBkYXRhKTsKICAgIH0KfTsKCi8vbm93IGRlZmluZSB0aGUgY2xhc3MgdGVtcGxhdGUgKGNhbGxlZCBob3N0IGNsYXNzKSB0aGF0IAovL2FjY2VwdHMgcG9saWN5IGFzIHRlbXBsYXRlIGFyZ3VtZW50CnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRQcmludFBvbGljeT4KY2xhc3MgaG9zdAp7CiAgICB0eXBlZGVmIFRQcmludFBvbGljeSBwcmludF9wb2xpY3k7CiAgICBUIGRhdGE7CiBwdWJsaWM6CiAgICBob3N0KFQgY29uc3QgJiBkKSA6IGRhdGEoZCkge30KICAgIHZvaWQgcHJpbnQoKSAKICAgIHsKICAgICAgICBwcmludF9wb2xpY3k6OnByaW50KGRhdGEpOwogICAgfQp9OwoKLy90ZXN0IGNvZGUKaW50IG1haW4oKQp7CiAgaG9zdDxpbnQsIGNvdXRfcHJpbnRfcG9saWN5PiAgICAgIGljKDEwMCk7CiAgaG9zdDxkb3VibGUsIGNvdXRfcHJpbnRfcG9saWN5PiAgIGRjKDEwMC4wKTsKCiAgaG9zdDxpbnQsIHByaW50Zl9wcmludF9wb2xpY3k+ICAgIGlwKDEwMCk7CiAgaG9zdDxkb3VibGUsIHByaW50Zl9wcmludF9wb2xpY3k+IGRwKDEwMC4wKTsKCiAgaWMucHJpbnQoKTsKICBkYy5wcmludCgpOwogIGlwLnByaW50KCk7CiAgZHAucHJpbnQoKTsKfQoK