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

Сообщение Re: почему SFINAE не рабоает? от 18.02.2020 14:28

Изменено 18.02.2020 14:36 rg45

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

X>привет!


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


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

X>
X>namespace detail {

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

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

X>} // ns detail

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

X>

X>но в конечном счете я получаю true:
X>чяднт?

Трудно делать диагностику, не видя всего кода. И реализация is_serializable стремная, я бы так делать не стал. А попробуй-ка вот такой вариант:

template<typename Ar, typename T, typename = void>
struct is_serializable : std::false_type {};

template<typename Ar, typename T>
struct is_serializable<Ar, T, std::void_t<decltype(std::declval<Ar&>().save(std::declval<T>()))>> : std::true_type {};
Re: почему SFINAE не рабоает?
Здравствуйте, niXman, Вы писали:

X>привет!


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


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

X>
X>namespace detail {

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

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

X>} // ns detail

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

X>

X>но в конечном счете я получаю true:
X>чяднт?

Трудно делать диагностику, не видя всего кода. И реализация is_serializable стремная — у тебя две независимые перегрузки, причем вторая полностью перекрывает первую. Х.з. что там пошло не так, но я бы так делать не стал. А попробуй-ка вот такой вариант:

template<typename Ar, typename T, typename = void>
struct is_serializable : std::false_type {};

template<typename Ar, typename T>
struct is_serializable<Ar, T, std::void_t<decltype(std::declval<Ar&>().save(std::declval<T>()))>> : std::true_type {};