JFrame(用C++11特性重构系列——DllParser的实现)
作者:互联网
1 template <typename T> 2 std::function<T> GetFunction(const string& funcName) 3 { 4 auto it = m_map.find(funcName); 5 if (it == m_map.end()) 6 { 7 auto addr = GetProcAddress(m_hMod, funcName.c_str()); 8 if (!addr) 9 return nullptr; 10 m_map.insert(std::make_pair(funcName, addr)); 11 it = m_map.find(funcName); 12 } 13 14 return std::function<T>((T*) (it->second)); 15 }
上面的函数通过函数名从 dll 中获取函数地址,然后转换为std::function<T>类型的对象,其中 T 为函数签名,例如std::function<int(int, string)>!
1 template <typename T, typename... Args> 2 typename std::result_of<std::function<T>(Args...)>::type ExcecuteFunc(const string& funcName, Args&&... args) 3 { 4 auto f = GetFunction<T>(funcName); 5 if (f == nullptr) 6 { 7 string s = "can not find this function " + funcName; 8 throw std::exception(s.c_str()); 9 } 10 11 return f(std::forward<Args>(args)...); 12 }
上面的函数先通过 GetFunction 获取 std::function<T> 类型的函数对象,然后再用这个函数对象带着 Args 执行,返回结果是使用 std::result_of<std::function<T>(Args...)>::type 推导的!
标签:11,std,JFrame,函数,map,DllParser,Args,funcName,function 来源: https://www.cnblogs.com/JackZheng/p/16272415.html