funções C ++ exposto ao sistema de criação de scripts - tipos de parâmetros de auto-descrevendo

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

  •  19-09-2019
  •  | 
  •  

Pergunta

A C ++ Regras define motor em XML onde cada regra se resume a "se X, então Y", onde X é um conjunto de testes e Y um conjunto de ações. No código C ++, 'funções' utilizável em testes / acções são criados como uma classe para cada 'função', cada um com uma "corrida (args)" método ... cada um tem seu próprio conjunto de parâmetros.

Esta multa funciona.

Mas, uma ferramenta separada é queria salvar os usuários de mão-elaboração XML; o mecanismo de regras é destinado a não-programadores. As necessidades de ferramentas de saber todos os 'funções' disponíveis, assim como seus parâmetros de entrada necessários. Qual é a melhor maneira de pensar em fazer isso? I considerado um par de possibilidades:

  1. Um arquivo de configuração descreve as 'funções' e seus parâmetros, e é lido pela ferramenta. Isso é muito fácil, e o código real C ++ pode usá-lo para executar a validação de argumento, mas ainda assim o C ++ e XML não são garantidos para estar em sincronia - um programador pode modificar C ++ e se esqueça de atualizar o XML levando a erros de validação
  2. Cada classe 'função' tem métodos que descrevem. De alguma forma, as cargas de ferramentas as classes C ++ ... isso seria fácil em uma reflexão apoiar língua, mas mais confusa em C ++, provavelmente você teria que construir uma DLL especial com todas as 'funções' ou algo assim. O que significa sobrecarga extra.

O que faz sentido, dada a natureza de C ++ especificamente?

EDIT: é o descritivo título? Eu não posso pensar em um melhor.

Foi útil?

Solução

Há uma maneira 3º - IDL.

Imagine que você tem um aplicativo cliente-servidor, e você tem um gerador de código que produz classes de mensagens que você pode implantar no cliente e no servidor para que o usuário pode escrever um aplicativo usando a API do cliente e o processamento ocorre no servidor .. . este é um cenário típico RPC e é usado em DCE-RPC, ONC-RPC, CORBA, COM e outros.

O truque aqui é para definir as assinaturas dos métodos que o cliente pode chamar, que é feito em uma definição de interface de idioma. Isso não tem que ser difícil, mas é a fonte para a API de cliente / servidor, você executá-lo através de um gerador e produz o C ++ classes que você compilar-se para o cliente para o uso.

No seu caso, parece que o XML é o IDL. assim você pode criar uma ferramenta que leva o XML e produz os cabeçalhos C ++ que descrevem as funções que os expõe código. Você realmente não tem para gerar os arquivos CPP (você pode), mas é mais fácil apenas gerar os cabeçalhos, de modo que o programador que adiciona uma nova função / parâmetro não pode se esqueça de atualizar a implementação - ele só não irá compilar uma vez que os cabeçalhos foram re-gerado.

Você pode gerar um cabeçalho que é #included nos cabeçalhos C ++ existentes se há mais lá do que apenas as definições de funções.

.

Assim - que é a minha sugestão, # 3: gerar as definições de suas assinaturas XML definitivos

Outras dicas

Há uma outra maneira:

  • Adicione uma restrição que os tipos de argumentos ser uniforme em uma chamada de função.
  • definir um número máximo de argumentos
  • descrever os tipos e a precedência ou seja, converrts double para String mas não vice-versa

então você tem

void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) .. 

E outros tipos de dados concretos, como String, Date, etc.

Vantagens:

  • As variações na assinatura fixa e regular
  • é possível fornecer apenas o "maior" assinatura tipo (T)
  • funciona bem com modelos e pontes de linguagem
  • pode avisar ação f com 2 parâmetros inteiros indefinido
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top