QT6 源(69):阅读与注释处理槽函数重载的模板类 qOverload< T > ,此类定义于 qglobal.h

(1)信号与槽:connect()函数原型

在这里插入图片描述
++

在这里插入图片描述
在这里插入图片描述

(2)模板函数 qOverload《Args…》( & C :: func ), 谢谢文心 :

#ifdef Q_QDOC
// Just for documentation generation 
//看注释, if 分支仅用于文件生成,看来要学习 #else 分支
template<typename T>
auto qOverload(T functionPointer);

template<typename T>
auto qConstOverload(T memberFunctionPointer);

template<typename T>
auto qNonConstOverload(T memberFunctionPointer);

#else
template <typename... Args> //args... 是成员函数的参数类型包
struct QNonConstOverload    //适用于类的非 const 成员函数
{   // R应该是函数指针类型,T 是类类型
    template <typename R, typename T> //重载了()运算符,使本对象类似于模板函数
    constexpr auto operator()(R (T::*ptr)(Args...)) 
    	const noexcept -> decltype(ptr)
    { return ptr; }                   //这是本类的动态成员函数,依附于类对象的存在

    template <typename R, typename T> //本类的静态成员函数,不依附于类对象的存在
    static constexpr auto of(R (T::*ptr)(Args...)) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

template <typename... Args>
struct QConstOverload                 //本类适合于类 T 里的 const 成员函数
{
    template <typename R, typename T> //重载 ( ) 运算符
    constexpr auto operator()(R (T::*ptr)(Args...) const) 
    	const noexcept -> decltype(ptr)
    { return ptr; }

    template <typename R, typename T> //看来 of( ) 的作用更大
    static constexpr auto of(R (T::*ptr)(Args...) const) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

template <typename... Args>                //多基类继承
struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
{
    using QConstOverload<Args...>   ::of;  //使父类中的这四个函数可见
    using QConstOverload<Args...>   ::operator();
    using QNonConstOverload<Args...>::of;
    using QNonConstOverload<Args...>::operator();

    template <typename R>                  //ptr 指针指向的函数是普通函数,不再是类的成员函数
    constexpr auto operator()(R (*ptr)(Args...)) 
    	const noexcept -> decltype(ptr)
    { return ptr; }

    template <typename R>
    static constexpr auto of(R (*ptr)(Args...)) 
    	noexcept -> decltype(ptr)
    { return ptr; }
};

//以下看起来像是全局的模板变量定义,且使变量名等同于模板类名。
//此类变量实际是类对象,全局的类对象,才可以以后使用其 ( ) 运算符函数。
template <typename... Args> constexpr inline 
QOverload<Args...> qOverload = {}; // ={} 意思是变量的初始化采用默认值,没啥用

//虽然定义了三个全局变量,但还是上面的 qOverload 对象最强大
template <typename... Args> constexpr inline 
QConstOverload<Args...> qConstOverload = {};

template <typename... Args> constexpr inline 
QNonConstOverload<Args...> qNonConstOverload = {};
#endif

(3) 以下给出文心的教导

在这里插入图片描述
在这里插入图片描述

(4)

谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值