#include <iostream>
#include <type_traits>
// For enum
template<typename T>
typename std::enable_if<std::is_enum<T>::value, bool>::type
func(T& t, int x)
{
std::cout << "enum" << std::endl;
}
// for other
template<typename T>
typename std::enable_if<!std::is_enum<T>::value, bool>::type
func(T& t, int x)
{
std::cout << "other" << std::endl;
}
// for unsigned char
template <>
bool func(unsigned char& t, int x)
{
std::cout << "unsigned char" << std::endl;
}
enum class E1 {value1, value2};
enum E2 {value3, value4};
int main() {
const int x = 42;
E1 e1 = E1::value1;
E2 e2 = value3;
unsigned char c = '*';
int i = 42;
func(e1, x);
func(e2, x);
func(c, x);
func(i, x);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgovLyBGb3IgZW51bQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2VudW08VD46OnZhbHVlLCBib29sPjo6dHlwZQpmdW5jKFQmIHQsIGludCB4KQp7CglzdGQ6OmNvdXQgPDwgImVudW0iIDw8IHN0ZDo6ZW5kbDsKfQoKLy8gZm9yIG90aGVyCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2VudW08VD46OnZhbHVlLCBib29sPjo6dHlwZQpmdW5jKFQmIHQsIGludCB4KQp7CglzdGQ6OmNvdXQgPDwgIm90aGVyIiA8PCBzdGQ6OmVuZGw7Cn0KCi8vIGZvciB1bnNpZ25lZCBjaGFyCnRlbXBsYXRlIDw+CmJvb2wgZnVuYyh1bnNpZ25lZCBjaGFyJiB0LCBpbnQgeCkKewoJc3RkOjpjb3V0IDw8ICJ1bnNpZ25lZCBjaGFyIiA8PCBzdGQ6OmVuZGw7Cn0KCmVudW0gY2xhc3MgRTEge3ZhbHVlMSwgdmFsdWUyfTsKZW51bSBFMiB7dmFsdWUzLCB2YWx1ZTR9OwoKaW50IG1haW4oKSB7Cgljb25zdCBpbnQgeCA9IDQyOwoJRTEgZTEgPSBFMTo6dmFsdWUxOwoJRTIgZTIgPSB2YWx1ZTM7Cgl1bnNpZ25lZCBjaGFyIGMgPSAnKic7CglpbnQgaSA9IDQyOwoJCglmdW5jKGUxLCB4KTsKCWZ1bmMoZTIsIHgpOwoJZnVuYyhjLCB4KTsKCWZ1bmMoaSwgeCk7Cn0=