C++ 在编译时存储结构元数据以实现序列化 #包括 #包括 #包括 #包括 #包括 结构外场基地 { //要启用动态_cast。 虚空fb() { } }; 模板 结构字段:公共字段库 { 字段(A B::*v): 价值(v) { } A B::*值; }; 模板
在编译时存储结构元数据以实现序列化C++ 在编译时存储结构元数据以实现序列化 #包括 #包括 #包括 #包括 #包括 结构外场基地 { //要启用动态_cast。 虚空fb() { } }; 模板 结构字段:公共字段库 { 字段(A B::*v): 价值(v) { } A B::*值; }; 模板,c++,C++,在编译时存储结构元数据以实现序列化 #包括 #包括 #包括 #包括 #包括 结构外场基地 { //要启用动态_cast。 虚空fb() { } }; 模板 结构字段:公共字段库 { 字段(A B::*v): 价值(v) { } A B::*值; }; 模板 结构元数据 { 静态std::向量场; }; 结构测试 { 无符号整数a; std::字符串b; }; 模板 结构元数据 { 静态常量std::向量场; }; const std::vector MetaData::fields{new Fi
#包括
#包括
#包括
#包括
#包括
结构外场基地
{
//要启用动态_cast。
虚空fb()
{
}
};
模板
结构字段:公共字段库
{
字段(A B::*v):
价值(v)
{
}
A B::*值;
};
模板
结构元数据
{
静态std::向量场;
};
结构测试
{
无符号整数a;
std::字符串b;
};
模板
结构元数据
{
静态常量std::向量场;
};
const std::vector MetaData::fields{new Field(&Test::a),new Field(&Test::b)};
模板
无效序列化(常量A和对象)
{
std::难道你对它的作用、应该做什么以及你的目标的解释有点……含糊不清。如此之多以至于我不太确定问题是什么。希望这能有所帮助,回头看看。@Deduplicator,我认为整个事情归结到这一点(什么能让我找到解决方案)。我认为存储字段信息的正确方法是元组。但我不知道如何访问元组中的所有元素,而不管其大小。对于FieldBase
ctor,请看我在这里的回答:一个问题:是要对编译时反射进行全面评估和测试,还是更多的运行时操作?首先可能在mod中更高级C++中的C++标准是什么限制?C++ 14?最简单的方法是用编程方式访问元组的所有元素,也就是模板递归。C++14中的编译时常量:make_tuple(&typeid(A),&A::element1和&A::element2);
。存储类似于type_特征的内容,以便序列化程序可以轻松找到它们。
#include <iostream>
#include <string>
#include <tuple>
#include <vector>
#include <cstdlib>
struct FieldBase
{
// To enable dynamic_cast.
virtual void fb()
{
}
};
template <typename A, typename B>
struct Field : public FieldBase
{
Field(A B::* v) :
value(v)
{
}
A B::* value;
};
template <typename A>
struct MetaData
{
static std::vector<FieldBase> fields;
};
struct Test
{
unsigned int a;
std::string b;
};
template <>
struct MetaData<Test>
{
static const std::vector<FieldBase*> fields;
};
const std::vector<FieldBase*> MetaData<Test>::fields{ new Field<unsigned int, Test>(&Test::a), new Field<std::string, Test>(&Test::b) };
template <typename A>
void serialize(const A& object)
{
std::cout << typeid(A).name() << std::endl;
for (const FieldBase* field : MetaData<A>::fields)
{
const Field<unsigned int, A>* f1 = dynamic_cast<const Field<unsigned int, A>*>(field);
if (f1 != 0)
std::cout << object.*f1->value << std::endl;
const Field<std::string, A>* f2 = dynamic_cast<const Field<std::string, A>*>(field);
if (f2 != 0)
std::cout << object.*f2->value << std::endl;
}
}
int main()
{
Test test;
test.a = 2014;
test.b = "Hello";
serialize(test);
std::cin.sync();
std::cin.get();
return EXIT_SUCCESS;
}
std::tuple<Field<unsigned int, Test>, Field<std::string, Test>>