Как будет работать готовый механизм для такой вещи? Например, что делать, если вы изменили boost::variant<int,double>
на boost::variant<int,std::string>
и больше не можете удерживать двойное число? Бросить исключение?
Если вы хотите что-то подобное, я бы подумал, что вам придется написать это самостоятельно, чтобы охватить ожидаемые вами случаи и соответствовать вашему определению «надежный».
Вы также можете встроить некоторую логику обновления файлов ... например, каждая версия N вашей программы хранит старые копии определений структур для (N-1, N-2 ...), так что вы возможность писать подпрограммы, которые можно использовать, предлагая возможность обновить старые файлы, с которыми он сталкивается.
Но, на самом деле, лучше сначала правильно настроить форматы файлов, прежде чем выпускать программу в дикую природу! Особенно данные, кодирующие намерения пользователя (производные структуры, которые фактически являются просто кэшами, могут быть выброшены и пересчитаны, если версия их не распознает).