Я довольно часто использую метапрограммирование, но иногда комбинации макросов и шаблонов c просто недостаточно.
Я полагаю, что недостатком может быть отсутствие кроссплатформенной совместимости, если платформа метапрограммированиятолько для, скажем, linux и т. д.
Так что да, есть ли такая вещь прямо сейчас, кроме шаблонов?В поиске метапрограммирования в Google преобладает метапрограммирование шаблонов, поэтому сейчас его сложно найти.
edit : вот пример того, над чем я работал.
Предположим, у меня есть общий класс для сохранения / загрузки файлов в буферы и из них.Давайте назовем его FilePack.
У меня есть макрос для определения, который выглядит как
defineFilePack(BaseClass, "code-a")
Он в основном создает класс с именем «BaseClassPack», который определен как подкласс.Ниже эта вещь.
class FilePack{
public:
char * thebuffer;
int bufsize;
string packcode;
// and constructors etc
FilePack(const string& thecode, int bufsize);
void operator=(FilePack& rhs);
void saveToFile(const string& filename);
void loadFromFile(const string& filename);
// .. and all the function you'd expect to see in a class like this
};
// the person details
class PersonDetails{
public:
solidstring<64> name;
int age;
DateTime birthday;
// .. yada yada yada
};
defineFilePack(PersonDetails, "psd")
// the above creates the following class
class PersonDetailsPack : public FilePack{
public:
PersonDetailsPack():
FilePack("psd", sizeof(PersonDetails)){ // etc
}
PersonDetails& get(){
return *(PersonDetails*)getBuffer();
}
// and a lot more convenience function
};
Теперь, по сути, есть встроенная проверка конструктора FilePack, что объявленный код соответствует размеру, с использованием глобальной карты.
Прямо сейчас я нахожусь в тупике о том, какСделайте это, используя шаблонное метапрограммирование, которое на самом деле хорошо подходит для этого, потому что все эти коды файловых пакетов объявлены внутри исходного файла.Конечно, кто-то может сделать свой собственный FilePack во время выполнения, но это не главное.
Еще одна вещь, с которой здесь может помочь метапрограммирование, - поддержка загрузки различных версий FilePack.Предположим, мне пришлось обновить класс PersonDetails. Я просто создаю новый класс, использую какое-то метапрограммирование для объявления наследования и волшебным образом заставляю FilePack знать, чтобы при загрузке старой версии PersonDetails он мог вызывать функцию преобразования, иличто угодно.
Кроме того, вы можете прокомментировать эту архитектуру, и я хотел бы услышать какие-либо комментарии о ней, но это может быть немного не по теме?