#include <iostream>
#include <type_traits>
namespace A { class Foo {}; }
namespace B { class Foo {}; class Bar {}; }
namespace C { class Foo {}; }
template<typename T>
struct is_Foo: public std::integral_constant<bool,
std::is_same<T, A::Foo>::value || std::is_same<T, B::Foo>::value ||
std::is_same<T, C::Foo>::value> {};
int main() {
std::cout << is_Foo<A::Foo>::value << ' ' << is_Foo<B::Foo>::value << ' '
<< is_Foo<C::Foo>::value << ' ' << is_Foo<B::Bar>::value
<< std::endl;
return (0);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAKbmFtZXNwYWNlIEEgeyBjbGFzcyBGb28ge307IH0KbmFtZXNwYWNlIEIgeyBjbGFzcyBGb28ge307IGNsYXNzIEJhciB7fTsgfQpuYW1lc3BhY2UgQyB7IGNsYXNzIEZvbyB7fTsgfQogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBpc19Gb286IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCiAgICBzdGQ6OmlzX3NhbWU8VCwgQTo6Rm9vPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIEI6OkZvbz46OnZhbHVlIHx8IAogICAgc3RkOjppc19zYW1lPFQsIEM6OkZvbz46OnZhbHVlPiB7fTsKIAppbnQgbWFpbigpIHsKIHN0ZDo6Y291dCA8PCBpc19Gb288QTo6Rm9vPjo6dmFsdWUgPDwgJyAnIDw8IGlzX0ZvbzxCOjpGb28+Ojp2YWx1ZSA8PCAnICcgCiAgICAgICAgICAgPDwgaXNfRm9vPEM6OkZvbz46OnZhbHVlIDw8ICcgJyA8PCBpc19Gb288Qjo6QmFyPjo6dmFsdWUgCiAgICAgICAgICAgPDwgc3RkOjplbmRsOwogCiByZXR1cm4gKDApOwp9