Estou lidando com a biblioteca IPC do cromo. Como uma descrição simples, quando uma mensagem é recebida, a função a seguir é chamada.
bool Execute(const std::string& name, const std::vector<value_type>& arguments);
name
contém o nome da mensagem e os argumentos são uma lista de valores passados para processamento. Já tenho cerca de 30 tipos diferentes de mensagens e estou crescendo. Como uma extração óbvia, em vez de tratar tudo em execução, criei uma função por tipo de mensagem. Então agora Execute
parece assim:
bool Execute(const std::string& name, const std::vector<value_type>& arguments)
{
if (name == "func1")
return func1();
else if (name == "func2")
return func2();
else if (name == "func3")
return func3();
else if (name == "func4")
return func4();
else if (name == "func5")
return func5();
else if (name == "func6")
return func6();
...
}
name
sempre terá o mesmo valor da função a ser chamada. Existe uma maneira de eliminar essa enorme cadeia de instruções if (acionar um switch não conta)? Além disso, todos os nomes possíveis serão conhecidos em tempo de compilação, mas não posso modelar isso, pois tecnicamente o nome não é uma string em tempo de compilação.
As strings e ponteiros de função são constantes estáticas, então você pode usar um global
std::map<std::string, ...>
para armazenar o mapeamento.Isso reuniria a semântica de mapeamento de uma forma mais sustentável e, como bônus, aproveitaria as otimizações de pesquisa no
map
.