le funzioni C ++ esposti al sistema di scripting - tipi di parametri di auto-descrive

StackOverflow https://stackoverflow.com/questions/2039152

  •  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à:

  1. 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
  2. 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.

È stato utile?

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 a String 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top