Сообщение 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>но в конечном счете я получаю true:
X>чяднт?
Трудно делать диагностику, не видя всего кода. И реализация is_serializable стремная, я бы так делать не стал. А попробуй-ка вот такой вариант:
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>но в конечном счете я получаю true:
X>чяднт?
Трудно делать диагностику, не видя всего кода. И реализация is_serializable стремная — у тебя две независимые перегрузки, причем вторая полностью перекрывает первую. Х.з. что там пошло не так, но я бы так делать не стал. А попробуй-ка вот такой вариант:
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 {};