Могу ли я написать функцию шаблона с аргументом T, который вызывает функцию-член foo, если он существует в T, и если он не вызывает свободную функцию foo(T) вместо (и не может скомпилироваться, если ни один существует)?
Что-то вроде:
template<typename T>
int call_foo(T t) {
// if T::foo() exists
    return t.foo();
// else return foo(t);
}
Как насчет обратного случая: предпочитая свободную функцию foo перед функцией-членом? Я не могу использовать какие-либо функции, введенные после С++ 11.
