#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);
}