I would warn you against such a design.
But, well, if you absolutely need that, you have to define a common interface to your functions. That is, your functions must have the same prototype.
For example, you can define some container class (or use something like boost::variant) that can be constructed from different data types, and you can write your 'add' functions so they accept an object of this class. What I mean is:
class DataContainer {
public:
DataContainer(int n) { int_data_ = n; }
DataContainer(char c) { int_data_ = c; }
DataContainer(const string s) { string_data_ = s; }
// let them be public to make code shorter
int int_data_;
string string_data_;
};
typedef void (*OpMethod)(const DataContainer);
void NumberAdd(const DataContainer data) {
// work with data.int_data_
}
map<string, map<string, OpMethod> > funcmap;
...
funcmap["number"]["add"] = NumberAdd;
Binding class methods would be a bit more difficult (you should specify an object instance as well). Consider using std::function.