编程语言
首页 > 编程语言> > JFrame(用C++11特性重构系列——DllParser的实现)

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