es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear un unordered_map de funciones miembro, puedes usar un puntero a función miembro como tipo de valor y un std::string como tipo de clave. Aquí tienes un ejemplo de cómo puedes hacerlo:

    #include <iostream>
    #include <unordered_map>
    
    class MiClase {
    public:
        void foo() { std::cout << "Llamado a foo" << std::endl; }
        void bar() { std::cout << "Llamado a bar" << std::endl; }
    };
    
    using FuncMiembro = void (MiClase::*)();
    using MapFuncMiembro = std::unordered_map<std::string, funcmiembro="">;
    
    int main() {
        MiClase obj;
        MapFuncMiembro mapa{
            { "foo", &MiClase::foo },
            { "bar", &MiClase::bar }
        };
    
        for (const auto& [nombre, funcion] : mapa) {
            // Llama a la función miembro usando el objeto y el puntero a función miembro
            (obj.*funcion)();
        }
    
        return 0;
    }
    

    En el ejemplo anterior, utilizamos MiClase como una clase de ejemplo que tiene dos funciones miembro: foo y bar. Creamos un alias de tipo FuncMiembro para simplificar la sintaxis del puntero a función miembro, y un alias de tipo MapFuncMiembro para definir el unordered_map. Luego creamos una instancia de MiClase e inicializamos el mapa con los punteros a las funciones miembro. Iteramos sobre el mapa y llamamos a las funciones miembro usando la instancia obj 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 funciones foo y bar 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,>

Comments are closed.