Пока foo () принимает аргумент типа char и bar () принимает любой T, это будет возможно.В противном случае нет.Обе ветви должны быть компилируемыми для любого T, с которым вы создаете экземпляр шаблона, даже если одна ветвь никогда не берется.Если обе ветви не могут быть скомпилированы для любого T, у вас нет другого выбора, кроме как использовать ветвление во время компиляции (что предпочтительно в любом случае).
В противном случае вы можете использовать Идентификацию типа времени выполнения:
if (typeid(T) == typeid(char))
или проверка во время компиляции:
if (boost::is_same<T, char>::value)
, где is_same может быть реализовано как
template <class T, class U>
struct is_same { static const bool value = false; };
template <class T>
struct is_same<T, T> { static const bool value = true; };