Search code examples
c++stldictionaryfunction-pointers

Using a STL map of function pointers


I developed a scripting engine that has many built-in functions, so to call any function, my code just went into an if .. else if .. else if wall checking the name but I would like to develop a more efficient solution.

Should I use a hashmap with strings as keys and pointers as values? How could I do it by using an STL map?

EDIT: Another point that came into my mind: of course using a map will force the compiler not to inline functions, but my inefficient approach didn't have any overhead generated by the necessity of function calls, it just executes code.

So I wonder if the overhead generated by the function call will be any better than having an if..else chain.. otherwise I could minimize the number of comparisons by checking a character at runtime (will be longer but faster).


Solution

  • Whatever your function signatures are:

    typedef void (*ScriptFunction)(void); // function pointer type
    typedef std::unordered_map<std::string, ScriptFunction> script_map;
    
    // ...
    
    void some_function()
    {
    }
    
    // ...
    
    script_map m;
    m.emplace("blah", &some_function);
    
    // ...
    
    void call_script(const std::string& pFunction)
    {
        auto iter = m.find(pFunction);
        if (iter == m.end())
        {
            // not found
        }
    
        (*iter->second)();
    }
    

    Note that the ScriptFunction type could be generalized to std::function</* whatever*/> so you can support any callable thing, not just exactly function pointers.