2012-06-14 14 views
10

He hecho un mapa de funciones. todas estas funciones son nulas y reciben un solo parámetro de cadena.Mapa de funciones C++

código:

void f1(string params){...} 
void f2(string params){...} 
void f3(string params){...} 

map<string , void*> funcMap; 

funcMap["f1"] =(void*)&f1; 
funcMap["f2"] =(void*)&f2; 
funcMap["f3"] =(void*)&f3; 

Como llamar una función? probé el siguiente código, pero ID no funciona:

void (*func)(string) = &funcMap[commandType]; 
func(commandParam); 

me sale este mensaje de error:

Server.cpp:160:46: error: cannot convert ‘void**’ to ‘void (*)(std::string) {aka void (*)(std::basic_string<char>)}’ in initialization 

Respuesta

16
typedef void (*pfunc)(string); 

map<string, pfunc> funcMap; 
funcMap["f1"] = f1; //and so forth 

y luego llamar a:

pfunc f = funcMap[commandType]; 
(*f)(commandParam); 

En general, ¿por qué tirar la seguridad de tipos? Si es un mapa de punteros de función, declare que es uno.

+0

gracias! funcionó :) – kakush

+0

Acepte la respuesta, entonces :) Así es como decimos gracias aquí en SO. –

+0

¿Por qué no hacer que el compilador tome el calor? –

0

&funcMap[commandType]

tan sólo reduce la &. Tu error de compilación fue útil aquí. Tenía un void** a la derecha que se debe a que tomó la dirección de un puntero de función. No quieres dos niveles de indirección allí.

+0

intentó . no funcionó – kakush

+0

llamada con (* f) también – djechlin

2

¿Por qué no tenerlas como clases separadas?

Luego tenga los métodos como virtuales.

A continuación, puede tener un mapa entre la cadena y la clase base.

decir

class Someoperation 
{ 
    virtual void Doit() = 0; 
}; 

map<string, Someopertion> ops; 

Entonces

class MyOp : public Someoperation 
{ 
    void Doit() { /* Some code here */} 
}; 

Sólo tiene que añadir objetos

ops["Hello"] = MyOp(); 

luego llamarlo

ops["Hello"].Doit(); 
+0

El "ops [" Hello "] = MyOp();" saldrá el error porque no hay una asignación de MyOp a Someoperation. Necesita un mapa de punteros Someoperation para que funcione esa técnica. Y eso necesita una asignación dinámica y todo tipo de problemas de duración del objeto. –

+0

1. Herencia. 2. No se usan punteros –

+1

Intenta compilar. No puede tener un mapa de tipo abstracto, ya que es un error construir uno. –