- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 std::type_index
存储 std::unordered_map<std::type_index, MyProperty>
在 MyClass
.现在我想序列化(使用 boost::serialization)MyClass
.编译器说 struct std::type_index has no member named serialize
这表明 boost::serialization 不支持 std::type_index
.那么问题来了,遇到这种情况怎么办?有没有人有 serialize
std::type_index
的功能?或者是否有不同的对象可用于此 map
的 key 我需要的已经是可序列化的,可以做同样类型的事情。即,当我使用函数模板时:
template <typename T>
void MyClass::func(T)
{
myMap.find(std::type_index(typeid(T)));
}
下面是一个缺乏支持的demo:
#include <boost/archive/text_oarchive.hpp>
#include <fstream>
#include <typeindex>
int main()
{
std::type_index myTypeIndex = typeid(double);
std::ofstream outputStream("test.txt");
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << myTypeIndex;
outputStream.close();
return 0;
}
最佳答案
第 1 步:定义您自己的 boost::serialization::load/save<>
std::type_index 的重载
第 2 步:提供一种将字符串映射到 type_index 的方法,反之亦然。
第 3 步:根据名称将 type_index 存储在存档中。
当然,您需要记住将要用作 map 键的每种类型的名称注册。在下面的示例中,您将通过调用 register_name("Foo", typeid(Foo));
来完成此操作等
#include <iostream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/split_free.hpp>
#include <fstream>
#include <sstream>
#include <typeindex>
#include <tuple>
#include <vector>
#include <string>
struct nothing {};
using named_typeindex = std::tuple<std::string, std::type_index>;
std::vector<named_typeindex> name_register =
{
};
std::type_index type_for_name(const std::string& name)
{
auto i = std::find_if(std::begin(name_register), std::end(name_register),
[&name](const auto& entry) { return std::get<std::string>(entry) == name; } );
if (i == std::end(name_register))
return typeid(nothing);
return std::get<std::type_index>(*i);
}
std::string const& name_for_type(std::type_index type)
{
auto i = std::find_if(std::begin(name_register), std::end(name_register),
[type](const auto& entry) { return std::get<std::type_index>(entry) == type; } );
using namespace std::string_literals;
if (i == std::end(name_register))
throw std::logic_error("unregistered type "s + type.name());
return std::get<std::string>(*i);
}
bool register_name(std::string name, std::type_index ti)
{
if (type_for_name(name) == typeid(nothing))
{
name_register.push_back(std::make_tuple(std::move(name), ti));
return true;
}
return false;
}
namespace boost {
namespace serialization {
template<class Archive>
void save(Archive & ar, const std::type_index & t, unsigned int version)
{
ar << name_for_type(t);
}
template<class Archive>
void load(Archive & ar, std::type_index & t, unsigned int version)
{
std::string s;
ar >> s;
t = type_for_name(s);
}
} // namespace serialization
} // namespace boost
BOOST_SERIALIZATION_SPLIT_FREE(std::type_index);
int main()
{
std::type_index myTypeIndex = typeid(double);
std::ostringstream outputStream {};
boost::archive::text_oarchive outputArchive(outputStream);
outputArchive << myTypeIndex;
std::cout << outputStream.str() << std::endl;
return 0;
}
关于c++ - 序列化 `std::type_index`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219532/
我一直在使用 std::type_index存储 std::unordered_map在 MyClass .现在我想序列化(使用 boost::serialization)MyClass .编译器说
我正在尝试实现一个可变参数模板化成员函数,它可以接受一个 std::function 对象,该对象具有不同数量的模板参数或根本没有。 下面是我正在尝试的一个简化且可编译的示例。我希望能够将任何用户定义
考虑以下代码(工作正常): namespace fruit { struct apple{}; } namespace language{ struct english{}; } type
标准是否规定 std::type_index(typeid(obj)) 的调用对于该类型是唯一的?我找不到这方面的信息。从 type_info::name() 我得到了这个: Returns an i
我正在尝试创建一个 std::unordered_map,其中 value 是 std::type_index。以下代码段有效: std::unordered_map workingMap; work
std::type_index 有一个小于运算符,应该使用 std::type_info 但 std::type_info 没有小于运算符。 那么std::type_index怎么会有小于运算符呢?
假设我有一个主 DLL,其中有一个这样的类: class Test { public: typedef std::unordered_map Map; template void S
我需要按类型在 map 中键入一些数据。目前我有这样的事情: struct TypeInfoComparer { bool operator()(std::type_info const* a,
我有一个 vector std::type_index ,表示特定节点具有的特征类型。我正在实现一个函数来检查节点是否支持特定类型。它看起来像这样: std::vector traits; ... t
实际上,我正在尝试将访问者模式与一些模板一起使用。 我想解析我的 unordered_map,它包含 type_index 和 function 变量,但我得到一个我什至不明白的编译错误在阅读了很多关
我是一名优秀的程序员,十分优秀!