В моем эпическом стремлении сделать С++ делать что-то не так, я пытаюсь собрать скомпилированный класс, сгенерированный временем.
На основе определения препроцессора, например (грубая концепция)
CLASS_BEGIN(Name)
RECORD(xyz)
RECORD(abc)
RECORD_GROUP(GroupName)
RECORD_GROUP_RECORD(foo)
RECORD_GROUP_RECORD(bar)
END_RECORDGROUP
END_CLASS
Хотя я уверен, что создаю класс, который читает данные из файловой системы, используя эту структуру (возможно, даже делая это с использованием Metaprogramming шаблона), я не вижу, как я могу генерировать обе функции для доступа к данных и функции для чтения данных.
Я хотел бы получить класс, похожий на этот
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
}
};
Кто-нибудь знает, возможно ли это?
- EDIT--
Чтобы прояснить предполагаемое использование для этого. У меня есть файлы в стандартном формате, который я хочу прочитать. Формат уже определен, поэтому он не может быть изменен. Каждый файл может содержать любые записи номеров, каждый из которых может содержать любые подзаголовки числа.
В число различных типов записей входят различные подзадачи, но они могут быть определены. Так, например, запись Heightmap должна содержать карту высот, но может содержать необязательные нормали.
Поэтому я хотел бы определить запись для этого так:
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;
}
Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно каждое определение препроцессора дважды. Один раз для определения определения функции внутри класса и один раз для создания функции чтения. Поскольку препроцессор является чисто функциональным, я не могу подтолкнуть данные к очереди и сгенерировать класс по определению ENC_CLASS marco.
Я не вижу пути вокруг этой проблемы, но задавался вопросом, не сделал ли кто-нибудь, кто лучше понимает С++.