РЕДАКТИРОВАТЬ: совершенно новый ответ
Хорошо, я полностью переосмыслил вопрос и считаю, что я получаю то, что вы хотите. Я действительно делал это раньше: -P.
Вот идея, у меня есть базовый класс, который перегружает operator (), тогда у меня есть подкласс для каждой «арности» функций. Наконец, у меня есть фабричная функция, которая возвращает одну из этих вещей. Код большой (и, возможно, немного излишний), но работает хорошо. Большая часть перегрузок library_function
предназначена для поддержки различных синтаксисов, в основном ненужных. Он также поддерживает boost::bind
функции, функции-члены и т. Д., Гораздо больше, чем вам, вероятно, нужно.
http://pastebin.com/m35af190
Пример, использование:
// map of library functions which will return an int.
std::map<std::string, LibraryFunction<int> > functions;
// function to register stuff in the map
void registerFunction(const std::string &name, LibraryFunction<int> func) {
functions.insert(std::make_pair(name, func));
}
позже вы можете сделать это:
// the this param is so the function has access to the scripting engine and can pop off the parameters, you can easily chop it out
// register 2 functions, one with no params, one with 1 param
registerFunction("my_function", library_function1(*this, call_my_function));
registerFunction("my_function2", library_function0(*this, call_my_function2));
functions["my_function"]();
functions["my_function2"]();