#include <iostream>
#include <type_traits>
struct base { };
struct derived : base { };
struct anotherbase { };
struct anotherderived : anotherbase { };
template<typename T, bool = std::is_base_of<base, T>::value
|| std::is_base_of<anotherbase, T>::value>
struct Type { };
template<typename T>
struct Type<T, true>
{
typedef float mytype;
};
int main()
{
Type<base>::mytype a1 = 4.2f;
Type<anotherderived>::mytype a2 = 8.4f;
std::cout << a1 << '\n' << a2 << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpzdHJ1Y3QgYmFzZSB7IH07CnN0cnVjdCBkZXJpdmVkIDogYmFzZSB7IH07CnN0cnVjdCBhbm90aGVyYmFzZSB7IH07CnN0cnVjdCBhbm90aGVyZGVyaXZlZCA6IGFub3RoZXJiYXNlIHsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgPSBzdGQ6OmlzX2Jhc2Vfb2Y8YmFzZSwgVD46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX2Jhc2Vfb2Y8YW5vdGhlcmJhc2UsIFQ+Ojp2YWx1ZT4Kc3RydWN0IFR5cGUgeyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFR5cGU8VCwgdHJ1ZT4KewogICB0eXBlZGVmIGZsb2F0IG15dHlwZTsKfTsKCmludCBtYWluKCkKewogICBUeXBlPGJhc2U+OjpteXR5cGUgYTEgPSA0LjJmOwogICBUeXBlPGFub3RoZXJkZXJpdmVkPjo6bXl0eXBlIGEyID0gOC40ZjsKICAgc3RkOjpjb3V0IDw8IGExIDw8ICdcbicgPDwgYTIgPDwgJ1xuJzsKfQ==