在我让C++做它本不应该做的事情的史诗般探索中,我正在尝试组合一个编译时生成的类。
根据预处理器定义(例如大致概念)
CLASS_BEGIN(Name)
RECORD(xyz)
RECORD(abc)
RECORD_GROUP(GroupName)
RECORD_GROUP_RECORD(foo)
RECORD_GROUP_RECORD(bar)
END_RECORDGROUP
END_CLASS
虽然我相当确定我可以使用类似这样的结构(甚至可能使用模板元编程)生成一个从文件系统读取数据的类,但我不知道如何同时生成访问数据的函数和读取数据的函数。
我想最终得到类似这样的一个类:
class Name{
public:
xyz_type getxyz();
void setxyz(xyz_type v);
//etc
list<group_type> getGroupName();
//etc
void readData(filesystem){
//read xyz
//read abc
//etc
}
};
有人知道这个是否可能实现吗?
--编辑--
为了澄清此功能的预期用途。我有一些以标准格式存储的文件,想要读取它们。格式已经定义好了,因此不能更改。每个文件可以包含任意数量的记录,每个记录可以包含任意数量的子记录。
众多记录类型都包含不同的子记录集,但它们是被定义好的。例如,高度图记录必须包含高度图,但可以选择包含法线。
因此,我会像这样定义一个记录:
CLASS_BEGIN(Heightmap)
RECORD(VHDT, Heightmap, std::string) //Subrecord Name, Readable Name, Type
RECORD_OPTIONAL(VNML, Normals, std::string)
END_CLASS
为此,我希望输出类似于以下类的功能:
class Heightmap{
public:
std::string getHeightmap(){
return mHeightmap->get<std::string>();
}
void setHeightmap(std::string v){
mHeight->set<std::string>(v);
}
bool hasNormal(){
return mNormal != 0;
}
//getter and setter functions for normals go here
private:
void read(Record* r){
mHeightmap = r->getFirst(VHDT);
mNormal = r->getFirst(VNML);
}
SubRecord* mHeightmap, mNormal;
}
我遇到的问题是需要每个预处理器定义两次。一次是为了在类中定义函数定义,另一次是为了创建读函数。由于预处理器纯粹是功能性的,我无法将数据推送到队列并在END_CLASS宏定义上生成类。我无法想到解决这个问题的方法,但我想知道是否有更深入了解C++的人有解决方法。