Сообщение почему SFINAE не рабоает? от 18.02.2020 13:46
Изменено 18.02.2020 13:53 niXman
почему SFINAE не рабоает?
привет!
подумал закодить шаблон для YAS, который буде сообщать, является ли сериализуемым какой-то конкретный тип, — но что-то SFINAE в данном случае не срабатывает, хоть и для НЕ-сериализуемого типа я получаю ошибку компиляции.
сначала минимальный пример:
этот код не скомпилится, потому что для nonserializable_type нет сериализатора.
далее, я полагаю что могу для этого использовать SFINAE, который благополучно был найден на просторах SO:
но в конечном счете я получаю true:
чяднт?
спасибо!
подумал закодить шаблон для 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;
чяднт?
спасибо!
почему SFINAE не рабоает?
привет!
подумал закодить шаблон для YAS, который будет сообщать, является ли сериализуемым какой-то конкретный тип, — но что-то SFINAE в данном случае не срабатывает, хоть и для НЕ-сериализуемого типа я получаю ошибку компиляции.
сначала минимальный пример:
этот код не скомпилится, потому что для nonserializable_type нет сериализатора.
далее, я полагаю что могу для этого использовать SFINAE, который благополучно был найден на просторах SO:
но в конечном счете я получаю true:
чяднт?
спасибо!
подумал закодить шаблон для 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;
чяднт?
спасибо!