Я думаю, что самый простой способ - это просто написать отдельный шаблон функции, который может вызвать C:
template <class T>
void call_bar(T& /*t*/)
{
}
template <>
void call_bar<Something>(Something& t)
{
t.bar();
}
Исходный класс 'C' может быть изменен соответственно:
void foo_2() {
....
T t;
call_bar(t); // does not require T to provide bar()
....
}
У этого недостатка есть то, что вы должны явно определить, какие типы T предоставляют метод bar, но это в значительной степени неизбежно, если вы не сможете определить во время компиляции все типы, которые предоставляют метод bar в их открытом интерфейсе или измените все эти типы поддержки столбцов, чтобы они имели что-то общее, что может быть определено во время компиляции.