Разница между SFINAE и отправкой тегов - PullRequest
2 голосов
/ 30 октября 2019

В этом видео https://youtu.be/Vkck4EU2lOU?t=582 "отправка тегов" и SFINAE представлены в качестве альтернатив, позволяющих добиться выбора требуемой функции шаблона.

Это правильно? Разве «отправка тегов» не использует SFINAE? Если это правильно, в чем разница между SFINAE и отправкой тегов?

1 Ответ

6 голосов
/ 30 октября 2019

Диспетчер тегов использует разрешение перегрузки для выбора правильной перегрузки.

auto f_impl(std::true_type) { return true; }
auto f_impl(std::false_type) { return std::string("No"); }

template <class T>
auto f(const T& t) {
    return f_impl(std::is_integral<T>());
}

SFINAE отключает кандидата, делая его непригодным из-за ошибки замещения.
Ошибка замены - это то, что говорится вОлово: Попытка заменить конкретные аргументы для параметров шаблона и обнаружение ошибки, которая в непосредственном контексте отвергает только этого кандидата.

template <class T>
auto f(const T& t)
-> std::enable_if_t<std::is_integral_v<T>, bool> {
    return true;
}
template <class T>
auto f(const T& t)
-> std::enable_if_t<!std::is_integral_v<T>, std::string> {
    return std::string("No");
}

Иногда одну или другую технику легче применить. И, естественно, они могут быть объединены с большим эффектом.

Дополнительные методы являются частичной и полной специализации. Кроме того, if constexpr часто может упростить вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...