#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
#include <iostream>
#include <ostream>
using namespace std;
struct Base1 {};
struct Derived1 : Base1 {};
struct Base2 {};
struct Derived2 : Base2 {};
template<typename T>
typename boost::enable_if< boost::is_base_of<Base1, T>, void >::type f(T* p)
{
cout << "Base1" << endl;
}
template<typename T>
typename boost::enable_if< boost::is_base_of<Base2, T>, void >::type f(T* p)
{
cout << "Base2" << endl;
}
int main()
{
Derived1 d1;
Derived2 d2;
f(&d1);
f(&d2);
}
I2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBCYXNlMSB7fTsKc3RydWN0IERlcml2ZWQxIDogQmFzZTEge307CgpzdHJ1Y3QgQmFzZTIge307CnN0cnVjdCBEZXJpdmVkMiA6IEJhc2UyIHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZjwgYm9vc3Q6OmlzX2Jhc2Vfb2Y8QmFzZTEsIFQ+LCB2b2lkID46OnR5cGUgZihUKiBwKQp7CiAgICBjb3V0IDw8ICJCYXNlMSIgPDwgZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZjwgYm9vc3Q6OmlzX2Jhc2Vfb2Y8QmFzZTIsIFQ+LCB2b2lkID46OnR5cGUgZihUKiBwKQp7CiAgICBjb3V0IDw8ICJCYXNlMiIgPDwgZW5kbDsKfQoKaW50IG1haW4oKQp7CiAgICBEZXJpdmVkMSBkMTsKICAgIERlcml2ZWQyIGQyOwogICAgZigmZDEpOwogICAgZigmZDIpOwp9Cg==