le funzioni C ++ esposti al sistema di scripting - tipi di parametri di auto-descrive
-
19-09-2019 - |
Domanda
Un motore di regole C ++ definisce regole XML in cui ogni regola riduce a "se X, allora Y", dove X è un insieme di test e Y un insieme di azioni. Nel codice C ++, 'funzioni' utilizzabile nei test / azioni sono creati come classe per ogni 'funzione', ciascuna avente un "(args) run" metodo ... ognuno prende la sua propria serie di parametri.
Questo funziona bene.
Ma, uno strumento separato è voluto salvare gli utenti XML-lavorazione a mano; il motore delle regole si rivolge a non programmatori. Lo strumento ha bisogno di conoscere tutte le 'funzioni' a disposizione, così come i loro parametri di input richiesti. Qual è il modo migliore per prendere in considerazione fare questo? Ho considerato un paio di possibilità:
- Un file di configurazione descrive le 'funzioni' e dei relativi parametri, e viene letto dallo strumento. Questo è abbastanza facile, e il codice vero e C ++ può essere utilizzato per eseguire la convalida degli argomenti, ma ancora il C ++ e XML non sono garantiti per essere in sincronia - un programmatore potrebbe modificare C ++ e dimenticare di aggiornare il codice XML che porta a errori di validazione
- Ogni classe 'funzione' ha metodi che lo descrivono. In qualche modo lo strumento carica le classi C ++ ... questo sarebbe facile in un linguaggio di supporto riflessione, ma Messier in C ++, si sarebbe probabilmente necessario costruire una DLL speciale con tutte le 'funzioni' o qualcosa del genere. Il che significa spese generali supplementari.
Ciò che ha senso data la natura del C ++ in particolare?
EDIT: è il titolo descrittivo? Non riesco a pensare ad uno migliore.
Soluzione
C'è un terzo modo - IDL.
Immaginate di avere un'applicazione client-server, e si dispone di un generatore di codice che produce classi wrapper che è possibile distribuire il client e il server in modo che l'utente può scrivere un'applicazione utilizzando l'API client e l'elaborazione avviene sul server .. . questo è un tipico scenario di RPC e viene utilizzato in DCE-RPC, ONC-RPC, CORBA, COM e altri.
Il trucco è quello di definire le firme dei metodi il cliente può chiamare, che è fatto in un Interface Definition Language. Questo non deve essere difficile, ma è la fonte per l'API client / server, lo si esegue attraverso un generatore e produce le classi C ++ che si compila per il client per l'utilizzo.
Nel tuo caso, suona come l'XML è l'IDL. in modo da poter creare uno strumento che prende il XML e produce le intestazioni C ++ che descrivono le funzioni che il codice espone. Non si hanno veramente a generare i file cpp (si potrebbe), ma la sua più facile di generare solo le intestazioni, in modo che il programmatore che aggiunge una nuova funzione / parametro non può dimenticare di aggiornare l'applicazione - semplicemente non compilerà una volta le intestazioni sono stati ri-generata.
È possibile generare un colpo di testa che viene #include nelle intestazioni esistenti C ++ se c'è più là che solo le definizioni di funzione.
Quindi - questo è il mio suggerimento, # 3:. Generare definizioni dalle vostre firme XML definitive
Altri suggerimenti
C'è un altro modo:
- Aggiungi un vincolo che i tipi degli argomenti siano uniformi in una chiamata di funzione.
- definire un numero massimo di argomenti
- descrivere i tipi e la precedenza cioè converrts
double
aString
ma non viceversa
poi si deve
void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) ..
E di altri tipi di dati concreti come stringa, data, ecc
I vantaggi:
- Le variazioni di firma fissa e regolare
- è possibile fornire solo il "più grande" tipo di firma (T)
- funziona bene con i modelli e ponti lingua
- può avvertire azione f con parametri interi 2 undefined