#include <iostream>
#include <type_traits>
struct A
{
A(int a) { std::cout << a << "\n"; }
};
struct B
{
B(int a) { std::cout << -a << "\n"; }
};
template<bool>
struct policy;
template<>
struct policy<true> { typedef A type; };
template<>
struct policy<false> { typedef B type; };
template<typename T>
struct C : public policy<std::is_polymorphic<T>::value>::type
{
typedef typename policy<std::is_polymorphic<T>::value>::type Base;
C() : Base(5) {}
};
int main()
{
C<int> a; // should print -5
C<std::ostream> b; // should print 5
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgQQp7CiAgICBBKGludCBhKSB7IHN0ZDo6Y291dCA8PCBhIDw8ICJcbiI7IH0KfTsKCnN0cnVjdCBCCnsKICAgIEIoaW50IGEpIHsgc3RkOjpjb3V0IDw8IC1hIDw8ICJcbiI7IH0KfTsKCnRlbXBsYXRlPGJvb2w+CnN0cnVjdCBwb2xpY3k7Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBwb2xpY3k8dHJ1ZT4geyB0eXBlZGVmIEEgdHlwZTsgfTsKCnRlbXBsYXRlPD4Kc3RydWN0IHBvbGljeTxmYWxzZT4geyB0eXBlZGVmIEIgdHlwZTsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBDIDogcHVibGljIHBvbGljeTxzdGQ6OmlzX3BvbHltb3JwaGljPFQ+Ojp2YWx1ZT46OnR5cGUKewoJdHlwZWRlZiB0eXBlbmFtZSBwb2xpY3k8c3RkOjppc19wb2x5bW9ycGhpYzxUPjo6dmFsdWU+Ojp0eXBlIEJhc2U7CiAgICBDKCkgOiBCYXNlKDUpIHt9Cn07CgppbnQgbWFpbigpCnsKICAgIEM8aW50PiBhOyAvLyBzaG91bGQgcHJpbnQgLTUKICAgIEM8c3RkOjpvc3RyZWFtPiBiOyAvLyBzaG91bGQgcHJpbnQgNQp9