#include <iostream>
template<typename T> struct bar { typedef void type; };
template<> struct bar<float> { typedef bar<float> type; };
template<> struct bar<double> { typedef bar<double> type; };
template<typename T>
struct foo : bar<T>::type
{
static void func()
{
std::cout << "primary template for float and double" << std::endl;
}
};
template<>
struct foo<bool>
{
static void func()
{
std::cout << "specialization for for bool" << std::endl;
}
};
int main()
{
foo<float>::func();
foo<double>::func();
foo<bool>::func();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IGJhciB7IHR5cGVkZWYgdm9pZCB0eXBlOyB9Owp0ZW1wbGF0ZTw+IHN0cnVjdCBiYXI8ZmxvYXQ+IHsgdHlwZWRlZiBiYXI8ZmxvYXQ+IHR5cGU7IH07CnRlbXBsYXRlPD4gc3RydWN0IGJhcjxkb3VibGU+IHsgdHlwZWRlZiBiYXI8ZG91YmxlPiB0eXBlOyB9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gCnN0cnVjdCBmb28gOiBiYXI8VD46OnR5cGUKewogICAgc3RhdGljIHZvaWQgZnVuYygpIAogICAgeyAKICAgICAgICBzdGQ6OmNvdXQgPDwgInByaW1hcnkgdGVtcGxhdGUgZm9yIGZsb2F0IGFuZCBkb3VibGUiIDw8IHN0ZDo6ZW5kbDsgCiAgICB9Cn07Cgp0ZW1wbGF0ZTw+IApzdHJ1Y3QgZm9vPGJvb2w+IAp7CiAgICBzdGF0aWMgdm9pZCBmdW5jKCkgCiAgICB7IAogICAgICAgc3RkOjpjb3V0IDw8ICJzcGVjaWFsaXphdGlvbiBmb3IgZm9yIGJvb2wiIDw8IHN0ZDo6ZW5kbDsgCiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgICBmb288ZmxvYXQ+OjpmdW5jKCk7CiAgICAgZm9vPGRvdWJsZT46OmZ1bmMoKTsKICAgICBmb288Ym9vbD46OmZ1bmMoKTsKfQ==