Информация об изменениях

Сообщение Re[9]: почему SFINAE не рабоает? от 18.02.2020 15:30

Изменено 18.02.2020 15:37 rg45

Re[9]: почему SFINAE не рабоает?
Здравствуйте, niXman, Вы писали:

X>т.е. мне нужно проверять именно наличие serializer<>::save(T)... думаю...


Можно проверять наличие свободной функции (save) для пары типов. И продоставить дженериковую версию такой функции с использованием SFINAE:

template <typename Ar, typename T>
auto save(Ar& ar, const T& t) -> decltype(std::declval<T>().save(std::declval<Ar&>()))
{
   return t.save();
}


Таким образом ты получаешь возможность реализовывать кастомную сериализацию либо как функцию-член, либо как свободную функцию. А с шаблонными функциями нужно быть поосторожнее в таких случаях. Их всеядность следует ограничивать, при помощи SFINAE.
Re[9]: почему SFINAE не рабоает?
Здравствуйте, niXman, Вы писали:

X>т.е. мне нужно проверять именно наличие serializer<>::save(T)... думаю...


Можно проверять наличие свободной функции (save) для пары типов. И продоставить дженериковую версию такой функции с использованием SFINAE:

template <typename Ar, typename T>
auto save(Ar& ar, const T& t) -> decltype(std::declval<T>().save(std::declval<Ar&>()))
{
   return t.save(ar);
}


Таким образом ты получаешь возможность реализовывать кастомную сериализацию либо как функцию-член, либо как свободную функцию. А с шаблонными функциями нужно быть поосторожнее в таких случаях. Их всеядность следует ограничивать, при помощи SFINAE.