像往常一樣與升壓序列化,定製你需要實現定製點這是任何一名成員serialize/load/save
或無功能serialize/load/save
用戶定義類型的治療(擡頭通過ADL)。
由於成員函數不是枚舉的選項,因此您需要爲您的類型提供過載,例如serialize
。可悲的是,沒有辦法得到一個通用的實現,比內置原語類型的預定義重載「更好」。
這裏是會接近(但它不工作¹):
namespace boost { namespace serialization {
template <typename Ar, typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
serialize(Ar& ar, T& e, unsigned)
{
ar & boost::serialization::make_binary_object(&e, sizeof(e));
}
} }
我們可以通過定義,枚舉有積分值作爲以「binary_object」序列化的快捷方式,因爲我們知道他們的基礎類型,這使它們成爲POD。
在此的光 - 不幸 - 限制,也許最好的方法是手動調用make_binary_object
如圖所示:
Live On Coliru
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/serialization/serialization.hpp>
#include <iostream>
#include <sstream>
using boost::serialization::make_binary_object;
enum class Example : uint8_t {
First = 1,
Second = 2,
};
int main() {
std::stringstream stream;
boost::archive::binary_oarchive ar(stream, boost::archive::no_header);
auto data = Example::First;
ar << make_binary_object(&data, sizeof(data));
std::cout << "Size: " << stream.str().size() << "\n";
}
哪個打印
Size: 1
如預期的那樣,
。您可以使用serialize
實現中的make_binary_object
包裝器,它將透明地處理序列化和反序列化。
請參見:Boost Serialization Wrappers Boost文檔中
¹出於同樣的原因,BOOST_IS_BITWISE_SERIALIZABLE(Example)
將無法正常工作;我測試了它
具有特定類型背景的枚舉是一個新的(ish)C++ 11功能,並且仍然有很大一部分是專門爲C++ 03設計的boost。這是_possible_這是'boost'不知道'新'語言功能的情況,並且boost需要更新。 –
我無法確定這是否是[如何在Boost中更改默認枚舉序列化的副本。序列化](http://stackoverflow.com/questions/7635534/how-to-change-the-default-enums-serialization-in-boost-serialization)或不。 –
我發現一個錯誤,其中強化類型枚舉失敗,並且它被關閉爲「無效」。不知道這是否意味着無意支持它或什麼。 https://svn.boost.org/trac/boost/ticket/6068 –