почему SFINAE не рабоает?
От: niXman Ниоткуда  
Дата: 18.02.20 13:46
Оценка:
привет!

подумал закодить шаблон для YAS, который будет сообщать, является ли сериализуемым какой-то конкретный тип, — но что-то SFINAE в данном случае не срабатывает, хоть и для НЕ-сериализуемого типа я получаю ошибку компиляции.

сначала минимальный пример:
    struct nonserializable_type {};

    using archive_type = yas::binary_oarchive<yas::mem_ostream>;
    yas::mem_ostream os;
    archive_type oa{os};

    nonserializable_type nst;
    oa.save(nst);

этот код не скомпилится, потому что для nonserializable_type нет сериализатора.

далее, я полагаю что могу для этого использовать SFINAE, который благополучно был найден на просторах SO:
namespace detail {

template<typename>
struct sfinae_true: std::true_type{};

template<typename Ar, typename T>
static auto test_serializable(int) -> sfinae_true<decltype(std::declval<Ar>().save(std::declval<T>()))>;
template<typename Ar, typename T>
static auto test_serializable(long) -> std::false_type;

} // ns detail

template<typename Ar, typename T>
struct is_serializable: decltype(detail::test_serializable<Ar, T>(0))
{};

но в конечном счете я получаю true:
    struct nonserializable_type {};

    using archive_type = yas::binary_oarchive<yas::mem_ostream>;

    std::cout << yas::is_serializable<archive_type, nonserializable_type>::value << std::endl;

чяднт?

спасибо!
Слово "совпадение" появилось после падения сов.
Отредактировано 18.02.2020 13:53 niXman . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.