C++可变参模板优雅的表示函数指针

C++函数指针转换为Functor的优雅实现与应用

目的

我们的是将函数指针
R(T::*ptr)(Args...)这种形式
变成 Functor<Args...>(ptr) 这种形式
在一个同名函数有多个重载方法的时候,这样的方式会比较优雅。
Functor是一个结构体或者类

RT,这里是从Qt的源码中学到的,防走丢,上代码

代码
template <typename... Args>
struct QNonConstOverload
{
    template <typename R, typename T>
    Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr)
    { return ptr; }

    template <typename R, typename T>
    static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...)) Q_DECL_NOTHROW -> decltype(ptr)
    { return ptr; }
};

template <typename... Args>
struct QConstOverload
{
    template <typename R, typename T>
    Q_DECL_CONSTEXPR auto operator()(R (T::*ptr)(Args...) const) const Q_DECL_NOTHROW -> decltype(ptr)
    { return ptr; }

    template <typename R, typename T>
    static Q_DECL_CONSTEXPR auto of(R (T::*ptr)(Args...) const) Q_DECL_NOTHROW -> 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>
    Q_DECL_CONSTEXPR auto operator()(R (*ptr)(Args...)) const Q_DECL_NOTHROW -> decltype(ptr)
    { return ptr; }

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

简单解释下

template <typename R, typename T>
auto of(R (T::*ptr)(Args...) const) Q_DECL_NOTHROW -> decltype(ptr)

拿这个举个例子,知道lamda表达式的肯定都懂,*’->decltype(ptr)’*其实就是声明返回值类型,这样前面的auto就能推导ptr的类型。然后这个 *R (T::*ptr)(Args…)*就是一个万能函数,函数指针不就是这么声明的吗?

使用例子
//QProcess中有这样一个函数

void 
QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus);

QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished)
//其中,int  QProcess::ExitStatus是参数类型,这里其实of省略了模板参数<void,QProcess>,一个是返回值类型,一个是类名,编译器推导出来了
QOverload<int, QProcess::ExitStatus>::of<void,QProcess>(&QProcess::finished)
//这是完整的形式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值