Выбор функции-члена с использованием условий Enable_If
Задача состоит в том, чтобы определить вызов функции-члена на основе параметра шаблона класса. Следующий фрагмент кода пытается добиться этого:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout Однако этот код не компилируется с ошибкой «нет типа с именем 'type' в 'struct std::enable_if'».
SFINAE в действии
Ключ к пониманию этой проблемы лежит в концепции «Неудачная замена не является ошибкой» (SFINAE). Enable_if разрешает условную компиляцию на основе аргументов шаблона. В этом случае аргумент шаблона T уже известен при создании экземпляров функций-членов. Таким образом, условие оценивается во время создания экземпляра и выбирается соответствующая функция.
Исправление кода
Чтобы исправить это, нам нужно ввести фиктивный аргумент шаблона, который по умолчанию установлено значение T. Это позволяет механизму SFINAE работать должным образом. Измененный код будет выглядеть следующим образом:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout Предотвращение явной специализации функций-членов
Как отмечает HostileFork, исходный код позволяет явно указывать аргументы шаблона для функций-членов, что может привести к неправильные результаты. Чтобы предотвратить это, мы можем добавить static_assert, который проверяет, предоставлены ли какие-либо аргументы шаблона. Это гарантирует, что на основе аргумента шаблона T всегда вызывается правильная функция-член. Модифицированный код будет таким:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3