В C ++ 11 самый простой способ сделать это - переопределить значение с помощью вспомогательной функции:
template <typename U>
auto foo_helper(U const& f, int) -> decltype(f()) {
return f();
}
template <typename U>
void foo_helper(U const&, long) {}
void foo() {
foo_helper(value, 0);
}
Преобразование из 0
в int
лучше, чем егопреобразование в long
, поэтому, если первая перегрузка жизнеспособна - это будет предпочтительнее.Если первая перегрузка нежизнеспособна, то мы вызываем вторую.
Если вас действительно волнует только о std::function
, то у нас могут быть более простые перегрузки:
void foo_helper(std::function<void()> const& f) {
f();
}
template <typename T>
void foo_helper(T const&) { }
void foo() {
foo_helper(value);
}