Używam metaprogramowania całkiem sporo, ale czasami kombinacja makr c i szablonów po prostu nie wystarcza.Czy istnieją jakieś alternatywy metaprogramowania w C++ oprócz szablonów?
Przypuszczam, że wada potencjalnie być brak kompatybilności między platformami jeśli platforma metaprogramming jest tylko dla, powiedzmy, Linux itp
Więc tak, jest tam coś takiego, dostępny w tej chwili, oprócz szablonów? Wyszukiwarka Google do metaprogramowania jest zdominowana przez metaprogramowanie szablonów, więc trudno go znaleźć teraz.
edycja: oto przykład na temat nad czym pracowałem.
Załóżmy, że mam ogólną klasę do zapisywania/wczytywania plików do i z buforów. Nazwijmy to FilePack.
mam zdefiniować makro, które wygląda
defineFilePack(BaseClass, "code-a")
To w zasadzie tworzy klasę o nazwie „BaseClassPack”, który jest zdefiniowany jako podklasa. Poniżej jest to.
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
};
Teraz jest rzeczywiście wbudowany sprawdzenie przez konstruktora FilePack że deklarowana kod pasuje do wielkości, przy użyciu globalnego mapę.
W tej chwili jestem zaskoczony, jak to zrobić za pomocą metaprogramowania szablonów, który jest w rzeczywistości odpowiedni dla niego, ponieważ wszystkie te kody pakietów są zadeklarowane w pliku źródłowym. Oczywiście, ktoś może prawdopodobnie stworzyć własny FilePack w czasie wykonywania, ale poza tym chodzi o to.
Inną rzeczą, która może pomóc w metaprogramowaniu, jest obsługa ładowania różnych wersji FilePack. Przypuśćmy, że muszę zaktualizować klasę PersonDetails. Po prostu utworzę nową klasę, użyję metaprogramowania, aby zadeklarować dziedziczenie, i magicznie wymyślę FilePack, aby podczas ładowania starej wersji PersonDetails mógł wywołać funkcję konwersji, lub cokolwiek.
Możesz również komentować tę architekturę i chcę usłyszeć komentarze na jej temat, ale może to być trochę nie na temat?
Czy możesz podać przykład, w którym szablony i makra nie są wystarczające? Byłby to dobry punkt wyjścia do dyskusji. –
@David Rodriguez: Na przykład generowanie kodu, który serializuje klasy w ramach połączenia sieciowego lub ogólnie robi coś dla każdego członka. – 6502
"ale czasami kombinacja makr c i szablonów to po prostu za mało" - czego brakuje/czego brakuje? – Naveen