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>>