C++ 在C+中序列化类型id+;11?

C++ 在C+中序列化类型id+;11?,c++,c++11,C++,C++11,假设我有一些模板类: template<class T> class Foo { void save(File& f); /* load */ Foo(const File& f); ... } 模板 福班 { 作废保存(文件(&f); /*加载*/Foo(常量文件&f); ... } 我有一个二进制文件格式的Foo。Foo::保存保存到文件,Foo(文件)构造函数从文件加载它 当我保存它时,我想在头中写入T的类型,然后当我加载它时,我

假设我有一些模板类:

template<class T>
class Foo
{
    void save(File& f);

    /* load */ Foo(const File& f);

    ...
}
模板
福班
{
作废保存(文件(&f);
/*加载*/Foo(常量文件&f);
...
}
我有一个二进制文件格式的Foo。Foo::保存保存到文件,Foo(文件)构造函数从文件加载它

当我保存它时,我想在头中写入T的类型,然后当我加载它时,我想验证构造函数中使用的T是否与文件中使用的T相同

我应该如何生成此类型代码


(例如,我可以SHA typeid(T).name()。但是,这可能会在程序调用之间发生变化。有更好的方法吗?

没有真正的自动、可移植的解决方案。我能想到的最好办法是维护一个手动列表:

#include <type_traits>

template <typename T> struct persistent_type_id; // unimplemented primary!

template <> struct persistent_type_id<MyClass>
: std::integral_constant<uint32_t, 0x12345678> { };

template <> struct persistent_type_id<AnotherClass>
: std::integral_constant<uint32_t, 0x12345679> { };

// ...
#包括
模板结构持久性类型id;//未实现的初级!
模板结构持久类型id
:std::积分_常数{};
模板结构持久类型id
:std::积分_常数{};
// ...
用法:

persistent_type_id<T>::value
persistent\u type\u id::value

如果未实现任何类型,将立即出现编译器错误。

为多个类型定义相同的id是不幸的,但这是可能的solution@Csq:谢谢-我想您可以使用一个单独的shell脚本来检查ID的健全性。由于您正在编写save()和load(),请在代码中输入T。你看过谷歌的协议缓冲区了吗?@brianbeuning:你说的“在代码中放入T”是什么意思?我错过了模板部分。不要介意。