2013-01-19 40 views
2

假設我有一些模板類:在C++ 11中序列化類型ID?

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

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

    ... 
} 

我有富的二進制文件格式。 Foo :: save保存到文件中,Foo(File)構造函數從文件中加載它。

當我保存它時,我想在頭文件中寫T的類型,然後當我加載它時,我想驗證在構造函數中使用的T與文件的T相同。

我應該如何生成這種類型的代碼?

(例如,我可以SHA的typeid的(T)。名稱()。然而,這可以在程序調用之間改變,有沒有更好的辦法?)

+0

由於您正在編碼save()和load(),因此請將T放入代碼中。你看過Google的協議緩衝區嗎? –

+0

@brianbeuning:你是什麼意思「把T放在代碼中」? –

+0

我錯過了模板部分。沒關係。 –

回答

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 

如果你留下任何類型的未實現的,你會得到一個編譯器錯誤的時候了。

+0

(不要忘記之後的分號) - 我不能編輯2個字符) – Csq

+0

爲多種類型定義相同的ID是不幸的,但可以使用此解決方案 – Csq

+0

@Csq:謝謝 - 您可以有一個單獨的shell腳本來檢查我想你的身份證明是否完整。 –