C++: существует ли биективное сопоставление между типами и любым другим типом данных, определенным стандартом?

Я работаю над проектом, который активно использует статический полиморфизм. Конкретный вариант использования, который меня интересует, стал бы возможен благодаря статическому отражению, но у нас до сих пор нет этого в C++. Вариант использования выглядит примерно так: у меня есть функции, которые читают/записывают структуру данных в/из двоичного файла:

      template <typename data_t> void write_binary(const my_type_t<data_t>& obj)
{
    //write a binary file...
}
template <typename data_t> void read_binary(my_type_t<data_t>& obj)
{
    //read a binary file...
}

Я хотел бы обеспечить, чтобы я мог читать данные только из файлов, которые были выведены одним и тем же типом, например, я могу читать только из двоичных файлов, выводимых с помощьюmy_type_t<std::string>и т. д. Я хочу сделать это, добавив небольшой заголовок к двоичному файлу, который идентифицирует специализацию:

      template <typename data_t> void write_binary(const my_type_t<data_t>& obj)
{
    //write header type_name(data_t)
    //write a binary file...
}
template <typename data_t> void read_binary(my_type_t<data_t>& obj)
{
    //read header
    //assert header == type_name(data_t)
    //read a binary file...
}

Я знаю о существованииtypeid(data_t).name()и различные методы его разборки, но я хочу что-то, что определено стандартом.

Итак, мой точный вопрос таков: для любых двух типовtype1_tиtype2_t, существует ли какое-либо стандартное отображение C++ "F", которое всегда подразумевает , иtype1_t == type2_tвсегда подразумеваетF(type1_t) == F(type2_t), независимо от компилятора? То есть существует ли какое-либо биективное сопоставление между типами и каким-либо сериализуемым значением, определенным стандартом С++?

РЕДАКТИРОВАТЬ В этом вопросе есть тонкость, которую я изначально не подчеркивал: я не хочу сериализовать произвольные типы. Тело функции, которая записывает мои объекты в файлы, уже реализовано. То, что я хочу (как указано в вопросе выше), — это просто уникальный идентификатор для каждого типа, который не зависит от компилятора . Роль шаблонной специализацииmy_type_t<data_t>влияет не на то , какая информация записывается/читается, а на то, как она интерпретируется .

Еще пара тематических моментов:

  • Из-за характера моего проекта я не могу заранее знать, какой шрифт будет, я должен позволить ему быть любым.
  • Для меня очень нежелательно предъявлять требования к типам, которые можно использовать для спецификации шаблона, т.е. требовать, чтобы люди реализовывали какое-то поле «имя» для своих типов. Это связано с тем, что окончательный типdata_tкоторый в конечном итоге используется для ввода-вывода, не привязан к интерфейсам, которым подвергаются мои пользователи.
  • Хотя детали того, как экземпляры типов хранятся в памяти, действительно зависят от платформы и компилятора, сами имена типов в конечном счете являются свойствами только исходного кода, а не компилятора.

0 ответов

Другие вопросы по тегам