#include <iostream>
#include <type_traits>
using namespace std;
class CBase{
public:
void basefunc(){
cout << "basefunc" << endl;
}
};
template<typename T,bool is_derived_from_base>
class Hoge_impl; // 何も定義しない
// 特殊化
template<typename T>
class Hoge_impl<T,true>{
T t;
public:
void func(){
t.basefunc();
}
};
template<typename T>
class Hoge : private Hoge_impl<T,std::is_base_of<CBase,T>::value>{
public:
using Hoge_impl<T,std::is_base_of<CBase,T>::value>::func;
};
class CDerived1 : public CBase{
};
class CDerived2 : public CBase{
};
class CNotDerived{
};
int main()
{
//これは通る。
Hoge<CDerived1> hoge1;
Hoge<CDerived2> hoge2;
//が、これは通らない。
//Hoge<CNotDerived> hoge3;
// Hoge<int> hoge4;
hoge1.func();
hoge2.func();
// hoge3.func();
// hoge4.func();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ0Jhc2V7CnB1YmxpYzoKICAgIHZvaWQgYmFzZWZ1bmMoKXsKICAgICAgICBjb3V0IDw8ICJiYXNlZnVuYyIgPDwgZW5kbDsKICAgIH0KfTsKCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULGJvb2wgaXNfZGVyaXZlZF9mcm9tX2Jhc2U+CmNsYXNzIEhvZ2VfaW1wbDsgLy8g5L2V44KC5a6a576p44GX44Gq44GECgovLyDnibnmrorljJYKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgSG9nZV9pbXBsPFQsdHJ1ZT57CiAgICBUIHQ7CnB1YmxpYzoKICAgIHZvaWQgZnVuYygpewogICAgICAgIHQuYmFzZWZ1bmMoKTsKICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIEhvZ2UgOiBwcml2YXRlIEhvZ2VfaW1wbDxULHN0ZDo6aXNfYmFzZV9vZjxDQmFzZSxUPjo6dmFsdWU+ewpwdWJsaWM6CiAgICB1c2luZyBIb2dlX2ltcGw8VCxzdGQ6OmlzX2Jhc2Vfb2Y8Q0Jhc2UsVD46OnZhbHVlPjo6ZnVuYzsKfTsKCmNsYXNzIENEZXJpdmVkMSA6IHB1YmxpYyBDQmFzZXsKfTsKY2xhc3MgQ0Rlcml2ZWQyIDogcHVibGljIENCYXNlewp9OwpjbGFzcyBDTm90RGVyaXZlZHsKfTsKCmludCBtYWluKCkKewogICAgLy/jgZPjgozjga/pgJrjgovjgIIKICAgIEhvZ2U8Q0Rlcml2ZWQxPiBob2dlMTsKICAgIEhvZ2U8Q0Rlcml2ZWQyPiBob2dlMjsKICAgIC8v44GM44CB44GT44KM44Gv6YCa44KJ44Gq44GE44CCCiAgICAvL0hvZ2U8Q05vdERlcml2ZWQ+IGhvZ2UzOwogICAgLy8gSG9nZTxpbnQ+IGhvZ2U0OwoKICAgIGhvZ2UxLmZ1bmMoKTsKICAgIGhvZ2UyLmZ1bmMoKTsKICAgIC8vIGhvZ2UzLmZ1bmMoKTsKICAgIC8vIGhvZ2U0LmZ1bmMoKTsKICAgIHJldHVybiAwOwp9