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 に答える