Llenando punteros a funciones de miembros en unordered_map para buscar funciones basadas en cadenas.
Tengo una clase que tiene ciertas funciones miembro de diferentes tipos. Ahora estoy tratando de crear un unordered_map de estas funciones miembro basado en una clave std::string.
He llegado hasta aquí: si creo una lambda sin capturar, devuelve el puntero de función a la función miembro. Pero no puedo averiguar cómo poner esa dirección en el unordered_map.
“`cpp
#include
#include
using std::cout;
using std::endl;
using std::string;
typedef void (*DoIt)();
class first
{
public:
void func_1(){std::cout<<“print from func1″<<endl;}; void=”” print_number();=”” int=”” update_number();=”” string=”” get_name();=”” void=”” print_name();=”” first(int=”” num,=”” string=”” n){number=”num;” name=”n;};” ~first(){std::cout<<“print=””></endl;};><std::endl;}; private:=”” int=”” number;=”” string=”” name;=”” };=”” void=”” first::print_number()=”” {=”” std::cout<<“number=””></std::endl;};><><endl; }=”” int=”” first::update_number()=”” {=”” number=”number” +=”” 1;=”” return=”” number;=”” }=”” string=”” first::get_name()=”” {=”” return=”” name;=”” }=”” void=”” first::print_name()=”” {=”” cout<<“name=”” from=”” print=”” name=”” is=””></endl;><><endl; }=”” using=”” namespace=”” std;=”” int=”” main()=”” {=”” first=”” f{6,=”” “johndoe”};=”” f.func_1();=”” f.print_number();=”” cout<<“new=”” number=”” is=””></endl;><f.update_number(); std::cout<<“hello=””></f.update_number();><std::endl; f.print_number();=”” cout<<“name=”” is=””></std::endl;><><endl; auto=”” f1=”[](first&” f)=”” {=”” f.print_name();};=”” f1(f);=”” auto=”” f2=”[](first&” f)=”” {=”” f.print_number();};=”” f2(f);=””></endl;><string,doit> umap_ptr;
umap_ptr[“ptr_num”] = &f2;
umap_ptr[“ptr_name”] = &f1;
unordered_map<string, int=""> umap;
umap["p_num"] = 1;
umap["p_name"] = 2;
for (auto x : umap)
cout << x.first << " " << x.second << endl;
return 0;
}
“`</string,></string,doit>
davy.ai
Para crear un
unordered_map
de funciones miembro, puedes usar un puntero a función miembro como tipo de valor y unstd::string
como tipo de clave. Aquí tienes un ejemplo de cómo puedes hacerlo:En el ejemplo anterior, utilizamos
MiClase
como una clase de ejemplo que tiene dos funciones miembro:foo
ybar
. Creamos un alias de tipoFuncMiembro
para simplificar la sintaxis del puntero a función miembro, y un alias de tipoMapFuncMiembro
para definir elunordered_map
. Luego creamos una instancia deMiClase
e inicializamos el mapa con los punteros a las funciones miembro. Iteramos sobre el mapa y llamamos a las funciones miembro usando la instanciaobj
y la sintaxis del puntero a función miembro.Para adaptar este enfoque a tu escenario, puedes reemplazar
MiClase
con tu propia clase y las funcionesfoo
ybar
con las funciones miembro que deseas asignar a claves de cadena. También puedes usar funciones lambda para crear el puntero a función miembro, como ya has demostrado en tu código de ejemplo.</std::string,>