Есть ли способ, с помощью SFINAE, определить, не перегружена ли свободная функция для данного класса?
В принципе, у меня есть следующее решение:
struct has_no_f { };
struct has_f { };
void f(has_f const& x) { }
template <typename T>
enable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has f" << std::endl;
}
template <typename T>
disable_if<has_function<T, f>::value, int>::type call(T const&) {
std::cout << "has no f" << std::endl;
}
int main() {
call(has_no_f()); // "has no f"
call(has_f()); // "has f"
}
Простоперегрузка call
не работает, поскольку на самом деле существует много типов foo
и bar
, а функция call
не знает о них (в основном call
находится внутри a, и пользователи предоставляют свои собственные типы).
Я не могу использовать C ++ 0x, и мне нужно рабочее решение для всех современных компиляторов.
Примечание: решение аналогичного вопроса , к сожалению, неработа здесь.