2

假设我有一些模板类:

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

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

    ...
}

我有 Foo 的二进制文件格式。Foo::save 保存到文件中,Foo(File) 构造函数从文件中加载它。

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

我应该如何生成这种类型代码?

(例如,我可以对 typeid(T).name() 进行 SHA。但是这可以在程序调用之间改变。有更好的方法吗?)

4

1 回答 1

2

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

#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> { };

// ...

用法:

persistent_type_id<T>::value

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

于 2013-01-20T00:00:06.020 回答