подумал закодить шаблон для YAS, который будет сообщать, является ли сериализуемым какой-то конкретный тип, — но что-то SFINAE в данном случае не срабатывает, хоть и для НЕ-сериализуемого типа я получаю ошибку компиляции.
struct nonserializable_type {};
using archive_type = yas::binary_oarchive<yas::mem_ostream>;
using ArRes = decltype(std::declval<archive_type>().save(std::declval<nonserializable_type>()));
компилируется? Если да — значит тип результата archive_type::save не зависит от состава nonserializable_type. Значит — так ты не сможешь определить, будет ли компилироваться тело save. Другими словами — если результирующий тип save известен компилятору без учета типа аргумента — то нет никакого "substitution failure" (ведь подстановка прошла удачно), соответственно, ты получаешь true_type в своем тесте.
А далее (вне твоего определятора, потом-потом...) уже компилятор инстанцирует save типом nonserializable_type, начинает его компилировать и натыкается на ошибки.
Здравствуйте, niXman, Вы писали:
X>привет!
X>подумал закодить шаблон для YAS, который будет сообщать, является ли сериализуемым какой-то конкретный тип, — но что-то SFINAE в данном случае не срабатывает, хоть и для НЕ-сериализуемого типа я получаю ошибку компиляции.
X>далее, я полагаю что могу для этого использовать SFINAE, который благополучно был найден на просторах SO: X>
Трудно делать диагностику, не видя всего кода. И реализация is_serializable стремная — у тебя две независимые перегрузки, причем вторая полностью перекрывает первую. Х.з. что там пошло не так, но я бы так делать не стал. А попробуй-ка вот такой вариант:
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, vopl, Вы писали:
V>> компилируется? Если да — значит тип результата archive_type::save не зависит от состава nonserializable_type.
X>думаю, ты ошибаешься... или я...
X>тут: X>
X>- не важно какой- тип вернет decltype(), важно лишь — чтоб expression был валидным...
компилятор этот expression не разворачивает и внутрь него не заглядывает... Вот посмотри сюда https://gcc.godbolt.org/z/UhGLUf — там тело save вообще не задано
Здравствуйте, vopl, Вы писали:
V>Здравствуйте, niXman, Вы писали:
X>>Здравствуйте, vopl, Вы писали:
V>>> компилируется? Если да — значит тип результата archive_type::save не зависит от состава nonserializable_type.
X>>думаю, ты ошибаешься... или я...
X>>тут: X>>
X>>- не важно какой- тип вернет decltype(), важно лишь — чтоб expression был валидным...
V>компилятор этот expression не разворачивает и внутрь него не заглядывает... Вот посмотри сюда https://gcc.godbolt.org/z/UhGLUf — там тело save вообще не задано
Здравствуйте, niXman, Вы писали:
R>> ... Ты уверен, что у тебя там нет какой-нибудь всеядной save?
X>если бы она была, код бы компилился успешно?
Ну это смотря какой код. И смотря как объявлены эти save. Своему варианту is_seralizable я доверяю, и он говорит, что какой-то save у тебя там находится, все-таки. Попробуй на место архива подставить какой-нибудь другой тип и убедишься, что он просто так 'true' не выдает.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, niXman, Вы писали:
X>просто, похоже, vopl — прав: компилятор просто видит что у архива есть метод save(T) да еще и шаблонный — и он считвает что все ОК...
Так и я высказывал это же предположение. Не лучше ли тебе в таком случае проверять наличие методов у сериализуемых объектов, а не у архива?
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>... Не лучше ли тебе в таком случае проверять наличие методов у сериализуемых объектов, а не у архива?
тут несколько неудобных моментов:
1)сериализация/десериализация может использовать как методы объектов, так и free-функции. но это не самое сложное.
2)фундаментальные типы не имеют ни того, ни другого. они сериализуются "внутри".
3)YAS поддерживает множество типов "изкоробки", типа строк, векторов, етц...
т.е. мне нужно проверять именно наличие serializer<>::save(T)... думаю...
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Таким образом ты получаешь возможность реализовывать кастомную сериализацию либо как функцию-член, либо как свободную функцию. А с шаблонными функциями нужно быть поосторожнее в таких случаях. Их всеядность следует ограничивать, при помощи SFINAE.
--
Не можешь достичь желаемого — пожелай достигнутого.