当前位置: 首页 > news >正文

河南省住房和城乡建设门户网站高端网站建设公司好吗

河南省住房和城乡建设门户网站,高端网站建设公司好吗,网站正建设中,九江专业的企业网站建设公司目的: 学习C模板的编写,使用模板类包装一个可调用对象 可调用对象包括:普通函数, lambda表达式, 类成员函数 可以参考到QtConcurrent::run的实现,可以看到这个函数有非常多重载,其中可以接受类…
目的:

学习C++模板的编写,使用模板类包装一个可调用对象
可调用对象包括:普通函数, lambda表达式, 类成员函数

可以参考到QtConcurrent::run的实现,可以看到这个函数有非常多重载,其中可以接受类成员函数的重载如下(截图仅能展示部分):
在这里插入图片描述
个人认为,这里的实现不是很好;这里是针对不同参数个数的函数,每一个都做一个重载,如果能实现一种方式,可以适配任意类型和数量的参数就好了

class AsyncTask
{
public:AsyncTask();// 支持可调用对象template <typename Functor, typename ...Args>static QFuture<std::result_of_t<Functor(Args...)>> postTask(Functor&& func, Args&& ...args){return QtConcurrent::run(std::forward<Functor>(func), std::forward<Args>(args)...);}// 支持类成员函数template <typename Class, typename ReturnType, typename... Args>static QFuture<ReturnType> postTask(Class* instance, ReturnType(Class::*memFunc)(Args...), Args&&... args){return QtConcurrent::run(instance, memFunc, std::forward<Args>(args)...);}
};

使用:

class A
{
public:int memFunc(double y, int x){qDebug() << "class member func:" << y << x << QThread::currentThreadId();return x;}
};int normalFunc(int x)
{qDebug() << "normal function:" << x << QThread::currentThreadId();return x;
}int main(int argc, char *argv[])
{QFuture<bool> future = AsyncTask::postTask([](int x, int y){qDebug() << "lambda:" << x << y << QThread::currentThreadId();return  x < y;}, 3, 2);       //绑定lambda表达式QFuture<int> future2 = AsyncTask::postTask(normalFunc, 5);      //绑定普通函数A x;QFuture<int> future3 = AsyncTask::postTask(&x, &A::memFunc, 2.5, 3);        //绑定类成员函数}

使用模板类包装类成员函数

// 模板类,用于包装类成员函数指针
template <typename Class, typename RetType, typename ...Args>
class MemberFunctionPointer
{
public:using MemFuncPtr = RetType(Class::*)(Args...);		//类成员函数指针MemberFunctionPointer(MemFuncPtr ptr, Class* obj): m_ptr(ptr), object(obj){}RetType invoke(Args&&... args){return (object->*m_ptr)(std:: forward<Args>(args)...);}
private:MemFuncPtr m_ptr;Class* object;
};// 辅助函数,用于模板参数推导
// C++17之前, 模板类的模板参数不能自动推导,必须显示指出, 例如std::vector<int>; std::list<int>; 而模板函数的模板参数可以自动推导, 所以标准库才提供 std::make_pair的函数,减轻模板类的编码负担
template <typename Class, typename RetType, typename... Args>
MemberFunctionPointer<Class, RetType, Args...> make_wrapper(RetType (Class::*fn)(Args...), Class* object)
{return MemberFunctionPointer<Class, RetType, Args...>(fn, object);
}

使用:

    auto wrapper = make_wrapper(&A::memFunc, &x);wrapper.invoke(3.2, 8);

在这里插入图片描述


在这里插入图片描述

参考

http://www.yayakq.cn/news/603268/

相关文章:

  • 电子商务网站建设 教案网站开发要求有哪些
  • 郴州网站制作公司常熟做网站多少钱
  • 国内知名的网站建设企业最好的做法
  • 什么网站做推广比较好涪陵做网站
  • 软件公司网站在线捕鱼网站建设
  • 免费营销型企业网站模板html5 制作手机网站
  • 做网站网页排版错误wordpress门户信息主题
  • php建站模板成品网站源码免费
  • 如何建双注册网站wordpress即时新闻
  • 做网站销售怎么开发客户做网站找我
  • 网站设置支付宝在线支付舟山网站建设公司
  • 肥城网站建设公司soho建网站
  • 新丝路网站建设百度总部
  • 品牌网站建设费wordpress commentor
  • 做企业邮箱的网站百度seo在线优化
  • asp网站建设实录网站备案成功怎么查备案号
  • 阿坝州城乡建设网站广州网络推广招聘
  • 免费医疗网站模板建造师报考条件
  • 有没有做会计的网站科技馆门票网上预约
  • 网站建设所需技术顺企网查企业电话
  • 客户网站建设软件开发需求分析常用的工具
  • 西部数码网站工具程序开发的步骤
  • 西安网站建设定不在百度做推广他会把你的网站排名弄掉
  • 一家专门做灯的网站网站服务提供商
  • 盐城哪家专业做网站做网站设计的总结
  • 四川网站网页设计电子商务平台及核心技术
  • 自然资源网站官网摄影网站的规划与设计
  • 如何制作动漫网站模板下载地址建筑公司网站新闻
  • 杭州画廊网站建设做企业网站的字体大小要求
  • 爱美眉网站源码网页设计图片居右代码