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.

Cómo gestionar diferentes tipos de funciones como contenedores

Estoy tratando de gestionar una lista de funciones a través de una plantilla en C++.

template<typename t,="" typename...="" args="">
std::map<std::wstring,></std::wstring,><t(args...)>> mFuncs;

El código anterior no es una oración correcta, pero al igual que en el concepto del código anterior, quiero gestionar varios tipos de funciones como una lista.

void RegistrarFunciones()
{
   mFuncs.emplace(L"Func1", [&]() -> bool { ... });
   mFuncs.emplace(L"Func2", [&](int a, std::string b) -> int { ... });
   mFuncs.emplace(L"Func3", [&](std::tuple<int, int="">& a) { ... });
   ...
   ...
   ...
   mFuncs.emplace(L"Func", [&](args...) -> auto { ... });
}
template<typename... targs="">
inline auto LlamarFuncion(const wchar_t* pKey, TArgs&&... pArgs)
{
   ...
   ...

   return mFuncs[std::forward<targs>(pArgs)...](pKey);
}

¿Cómo puedo implementar el concepto anterior?</typename…></int,></t(args…)>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para administrar diversos tipos de funciones como una lista utilizando plantillas de C++, puedes usar el contenedor std::map para almacenar una correspondencia entre los nombres de las funciones (como claves) y las funciones correspondientes (como valores). Para admitir diferentes firmas de funciones, puedes usar plantillas para definir los tipos de argumentos y de retorno de las funciones.

    Aquí tienes un ejemplo de implementación:

    “`c++
    #include
    #include

    #include

    // Declara una lista de funciones como un std::map que asigna nombres de funciones a std::functions
    template <typename… args=””>
    using FunctionList = std::map<std::wstring,></std::wstring,><void(args…)>>;

    // Define una función para registrar funciones en la lista
    template <typename… args=””>
    void RegisterFuncs(FunctionList<args…>& funcList)
    {
    funcList.emplace(L”Func1″, [](Args… args) -> void { /* implementación / });
    funcList.emplace(L”Func2″, [](Args… args) -> void { /
    implementación */ });
    }

    // Define una función para llamar a una función de la lista
    template <typename… args=””>
    void CallFunc(FunctionList<args…>& funcList, const wchar_t* key, Args… args)
    {
    if (auto it = funcList.find(key); it != funcList.end())
    {
    it->second(args…);
    }
    }
    “`

    En esta implementación, el tipo FunctionList está definido como una plantilla que toma los tipos de argumentos de las funciones como argumentos de plantilla. La función RegisterFuncs toma una referencia a un objeto FunctionList y agrega nuevas funciones a través de la función std::map::emplace.

    La función CallFunc toma una referencia a un objeto FunctionList, el nombre de la función a llamar y los argumentos a pasar a la función. Busca la función en el mapa utilizando std::map::find y, si existe, llama a la función con los argumentos especificados utilizando std::function::operator().</args…></typename…></args…></typename…></void(args…)></typename…>

Comments are closed.