Я пытаюсь создать функцию X, которая специализируется, когда предоставляется функция-член Y, и если функция-член Y не предоставляется, функция X использует глобальную функцию-член-член Y для достижения такой же эффект.SFINAE с функциями и эмулированием частичной специализации шаблона
Я в настоящее время пытаюсь добиться этого с помощью следующего кода
template <typename Container, typename std::enable_if_t<std::is_same<
decltype(std::declval<Container>().y()),
decltype(std::declval<Container>().y())>::value>* = nullptr>
void do_something(Container&& container) {
return std::forward<Container>().y();
}
template <typename Container, typename std::enable_if_t<!std::is_same<
decltype(std::declval<Container>().y()),
decltype(std::declval<Container>().y())>::value>* = nullptr>
void do_something(Container&& container) {
return y(std::forward<Container>(container);
}
Но в том случае, когда контейнер имеет как функцию-член у и глобальный не член функции у и работает на нем. Ошибка компиляции, потому что для второй версии функции аргумент шаблона плохо сформирован, потому что нужна функция-член y.
Любая идея, как я могу решить эту проблему?
ПРИМЕЧАНИЕ: Это отличается от простого определения того, имеет ли класс функцию данной сигнатуры. Извините, если вопрос, похоже, спрашивает об этом! Принятый ниже ответ должен сделать мое намерение более ясным.
@bolov Я отредактировал мой вопрос и добавил примечание. Ответ Барри ниже поясняет, что я хотел спросить! – Curious