C++标准是否定义了跨编译器的类型与可序列化值双射映射?
跨编译器的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>只能读取自身输出的文件),我计划通过在文件头部添加data_t的特化标识来实现,修改后的代码如下:
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()及各种解mangling方法,但需要C++标准定义的方案。
核心问题
对于任意两个类型type1_t和type2_t,是否存在C++标准定义的映射“F”,使得F(type1_t) == F(type2_t)当且仅当type1_t == type2_t,且该映射跨编译器有效?即标准是否定义了类型与可序列化值的双射映射?
补充说明
我并非要序列化任意类型,对象读写逻辑已实现,仅需一个跨编译器的类型唯一标识。my_type_t<data_t>中data_t的特化仅影响数据解析方式,不改变读写内容。额外要点:
- 无法提前知晓
data_t的具体类型,需支持任意类型; - 不希望对模板参数类型添加额外要求(如强制实现“name”字段),因为最终用于IO的
data_t与用户接口无关; - 类型实例的内存存储细节依赖平台和编译器,但类型名称本质是源码属性,与编译器无关。
内容的提问来源于stack exchange,提问作者wvn
相关产品推荐
相关产品推荐

