Можно ли сериализовать std :: function?

Это теоретический вопрос. Скажем, есть некоторые объекты, которые среди прочего содержат списки функций обратного вызова, подписанных на события этих объектов. Теперь мы хотим сохранить эти объекты на диске. Это std::function сериализации?

7

Решение

Нет.

Каждый раз, когда используется стирание типа (т. Е. Скрытие деталей реализации за интерфейсом), единственными доступными операциями, не зная динамического типа объекта, являются те, которые предоставляются интерфейсом.

В стандарте C ++ нет сериализации, и нет простого способа сериализации функции либо (без отражения), таким образом, std::function Интерфейс не обеспечивает сериализацию.

С другой стороны, ничто не мешает вы от использования Callback базовый класс, обеспечивающий поддержку сериализации.

6

Другие решения

std::function является объектом стирания типа, который подчиняется семантике значений Он предоставляет копирование / перемещение конструкции и назначения, а также выполнение конкретной подписи и уничтожение.

Ни один из них не является сериализацией.

Внутренне, типичная реализация std::function это создать помощник реализации template класс на его аргументе Конструированный-от, который оборачивает вышеуказанные операции над аргументом, затем std::function сам делегирует свою реализацию этих операций вспомогательному объекту.

Компоновка этого вспомогательного объекта будет зависеть от компоновки аргумента, сконструированного из (поверх его существования не обязательно, а его реализация зависит от реализации).

Вы можете попытаться создать подобный объект, который поддерживает сериализацию, но объект стирания типа основан на том факте, что стираемый тип уже реализует данную операцию. Это означает, что вы можете создать только стертую функцию с сериализацией из объекта, который поддерживает интерфейс функции с сериализацией, по крайней мере, на уровне утилитного типа.

5

Да, и нет, это не так. Теоретически вы можете сериализовать данные, на которых будет выполняться объект функции, но вам все равно понадобится скомпилированный код, поскольку вы не можете выполнять данные, не прибегая к уродливым хакерским атакам.

0
По вопросам рекламы [email protected]