#include <iostream>
struct Wibble
{
static const bool CAN_WIBBLE = true;
};
struct Wobble
{
static const bool CAN_WIBBLE = false;
};
struct Foo
{
template<bool wibble>
void _doStuff();
public:
template<typename T>
void doStuff()
{
_doStuff<T::CAN_WIBBLE>();
}
};
template<>
void Foo::_doStuff<true>() { std::cout << "wibble ..." << std::endl; }
template<>
void Foo::_doStuff<false>() { std::cout << "I can't wibble ..." << std::endl; }
int main()
{
Foo f;
f.doStuff<Wibble>();
f.doStuff<Wobble>();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFdpYmJsZQp7CiAgICBzdGF0aWMgY29uc3QgYm9vbCBDQU5fV0lCQkxFID0gdHJ1ZTsKfTsKCnN0cnVjdCBXb2JibGUKewogICAgc3RhdGljIGNvbnN0IGJvb2wgQ0FOX1dJQkJMRSA9IGZhbHNlOwp9OwoKc3RydWN0IEZvbwp7CiAgICB0ZW1wbGF0ZTxib29sIHdpYmJsZT4KICAgIHZvaWQgX2RvU3R1ZmYoKTsKCnB1YmxpYzoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICB2b2lkIGRvU3R1ZmYoKQogICAgewogICAgICAgIF9kb1N0dWZmPFQ6OkNBTl9XSUJCTEU+KCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZTw+CnZvaWQgRm9vOjpfZG9TdHVmZjx0cnVlPigpIHsgc3RkOjpjb3V0IDw8ICJ3aWJibGUgLi4uIiA8PCBzdGQ6OmVuZGw7IH0KCnRlbXBsYXRlPD4Kdm9pZCBGb286Ol9kb1N0dWZmPGZhbHNlPigpIHsgc3RkOjpjb3V0IDw8ICJJIGNhbid0IHdpYmJsZSAuLi4iIDw8IHN0ZDo6ZW5kbDsgfQoKaW50IG1haW4oKQp7CiAgICBGb28gZjsKICAgIGYuZG9TdHVmZjxXaWJibGU+KCk7CiAgICBmLmRvU3R1ZmY8V29iYmxlPigpOwogICAgcmV0dXJuIDA7Cn0K