Quindi ho questo enorme albero che è fondamentalmente un grosso interruttore/caso con chiavi stringa e chiamate di funzioni diverse su un oggetto comune a seconda della chiave e di un pezzo di metadati.Metaprogramming C/C++ usando il preprocessore
Ogni voce appare sostanzialmente in questo modo
} else if (strcmp(key, "key_string") == 0) {
((class_name*)object)->do_something();
} else if (...
dove do_something
può avere diverse invocazioni, quindi non posso semplicemente usare puntatori a funzione. Inoltre, alcune chiavi richiedono che l'oggetto venga trasmesso a una sottoclasse.
Ora, se dovessi codificare questo in un linguaggio di livello superiore, userei un dizionario di lambda per semplificare questo.
mi venne in mente che avrei potuto usare le macro per semplificare questo a qualcosa come
case_call("key_string", class_name, do_something());
case_call(/* ... */)
dove case_call
sarebbe una macro che espandere questo codice per il primo frammento di codice.
Tuttavia, sono molto sul recinto se questo sarebbe considerato di buon gusto. Voglio dire, ridurrebbe il lavoro di digitazione e migliorerebbe l'ESSENZIALITÀ del codice, ma in realtà sembra abusare del sistema macro in qualche modo.
Vuoi andare su quella strada, o meglio scrivere tutto? E quale sarebbe il tuo ragionamento per farlo?
Modifica
Alcuni chiarimenti:
Questo codice è utilizzato come strato collante tra un'API scripting semplificata che accede diversi aspetti di come semplici proprietà valori-chiave C++ API. Le proprietà sono implementate in diversi modi in C++: alcuni hanno metodi getter/setter, alcuni sono impostati in una struttura speciale. Le azioni di scripting fanno riferimento a oggetti C++ convertiti in una classe base comune. Tuttavia, alcune azioni sono disponibili solo su alcune sottoclassi e devono essere abbattute.
In fondo alla strada, posso cambiare l'attuale API C++, ma per il momento, deve essere considerato immutabile. Inoltre, questo deve funzionare su un compilatore incorporato, quindi boost o C++ 11 non sono (purtroppo) non disponibili.
Perché i voti da chiudere - questa è una domanda valida e valida. Cosa mi manca qui? –
È una bella domanda, ma "Questa domanda non è adatta al nostro formato di domande e risposte. Prevediamo che le risposte implichino generalmente fatti, referenze o competenze specifiche; * questa domanda richiederà probabilmente opinioni, dibattiti, discussioni, sondaggi o estensioni discussione. * " – Fanael
È già al punteggio +5, quindi quel tipo dice che gli altri, me compreso, sono interessati al risultato. La risposta qui sotto è già abbastanza carina. –