Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ std::map of heterogeneous function pointers

Is it possible to store pointers to various heterogenous functions like:

In the header:

int  functionA (int param1);
void functionB (void);

Basically this would the part I don't know how to write:


typedef ??boost::function<void(void)>?? functionPointer;

And afterwards:

map<char*,functionPointer> _myMap;

In the .cpp

void CreateFunctionMap()
{
    _myMap["functionA"] = &functionA;
    _myMap["functionB"] = &functionB;
    ...
}

And then reuse it like:

void execute(int argc, char* argv[])
{

    if(argc>1){
        int param = atoi(argv[1]);
        int answer;
        functionPointer mfp;
        mfp = map[argv[0]];
        answer = *mfp(param);
    }
    else{
        *map[argv[0]];
    }
}

etc.

Thanks

--EDIT--

Just to give more info:

The reason for this question is that I am implementing a drop-down "quake-style" console for an already existing application. This way I can provide runtime command line user input to access various already coded functions of various types i.e.:

 /exec <functionName> <param1> <param2> ...
like image 262
Smash Avatar asked Dec 05 '25 10:12

Smash


1 Answers

If you want to have "pointer to something, but I'm not going to define what, and it could be a variety of things anyway" you can use void *.

But you really shouldn't.

void * is purely a pointer. In order to do anything with it, you have to cast it to a more meaningful pointer, but at that point, you've lost all type safety. What's to stop someone from using the wrong function signature? Or using a pointer to a struct?

EDIT

To give you a more useful answer, there's no need to put this all into a single map. It's ok to use multiple maps. I.e.

typedef boost::function<void(void)> voidFunctionPointer;
typedef boost::function<int(int)>   intFunctionPointer;

map<std::string, voidFunctionPointer> _myVoidMap;
map<std::string, intFunctionPointer > _myIntMap;

void CreateFunctionMap()
{
  _myVoidMap["functionA"] = &functionA;
  _myIntMap["functionB"] = &functionB;
  ...
}

void execute(int argc, char* argv[])
{

  if(argc>1){
    int param = atoi(argv[1]);
    int answer;
    // todo: check that argv[0] is actually in the map
    intFunctionPointer mfp = _myIntMap[argv[0]];
    answer = mfp(param);
  }
  else{
    // todo: check that argv[0] is actually in the map
    voidFunctionPointer mfp = _myVoidMap[argv[0]];
    mfp();
  }
}
like image 78
Tim Avatar answered Dec 08 '25 02:12

Tim