我想知道是否有人知道如何完成以下任务:
假设我在SQL中存储了一堆数据,假设其中一个字段可以称为funcName,函数名将包含类似于“ myFunction”的数据,我想知道的是,有没有一种方法可以依次提取函数名称并实际调用该函数?
我可以想到几种方法来完成此任务,其中一种是将funcName更改为funcId并与数组或类似对象链接,但是我正在寻找更动态的东西,使我可以即时添加数据而不必每次我添加对新函数的调用时都会更新实际的源代码,当然前提是该函数已经存在并且可以通过我们从其调用的作用域位置进行访问。
任何帮助将不胜感激。
使用宏定义自动注册的新功能。
// callable_function.h class CallableFunction { public: virtual void operator()() = 0; }; class CallableFunctionRegistry { public: static CallableFunction *Register(const string &func_name, CallableFunction *func_impl) { Instance()->registered_functions_.insert(make_pair(func_name, func_impl)); } static void Run(const string &func_name) { (*Instance()->registered_functions_[func_name])(); } private: static CallableFunctionRegistry *Instance() { static CallableFunctionRegistry *instance = new CallablefunctionRegistry; return instance; } CallableFunctionRegistry() {} map<string, CallableFunction*> registered_functions_; }; #define REGISTER_CALLABLE_FUNCTION(FuncName) \ class FuncName : public CallableFunction { \ public: \ virtual void operator()(); \ }; \ CallableFunction *impl_ ##FuncName = \ CallableFunctionRegistry::Register(#FuncName, new FuncName); \ void FuncName::operator()()
并像这样使用它:
//other_file.cc REGISTER_CALLABLE_FUNCTION(DoStuff) { // do stuff here. }
还有这个:
//yet_another_file.cc CallableFunctionRegistry::Run("DoStuff");
您可以使用函数ptrs而不是CallableFunction对象来完成此操作,但是我的语法很模糊。无论哪种方式,都添加错误检查以检查重复的注册和未找到的查找。