my_mem_fun_ref将类成员函数转换为仿函数

本文介绍了一个使用C++模板和函数对象实现的例子,通过自定义的my_mem_fun_ref_t类来模仿C++标准库中的std::mem_fun_ref的功能。该示例展示了如何创建和使用模板来操作类成员函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <functional>
#include <list>
#include <algorithm>
#include <typeinfo>

using namespace std;

 class Shape
{
    private:
        int n;
    public:
        Shape(const int &_n)
            :n(_n)
        {
        }

        int draw()
        {
            cout<<n<<endl;
            return 0;//此处为兼容VC6.0.不支持传回void
        }
};

template <typename R, typename T>
class my_mem_fun_ref_t
:public unary_function <T, R>
{
    private:
        R (T::*pmf) ();//定义私有变量(以T为基类的成员函数的指针,返回类型为R)
    public:
        explicit my_mem_fun_ref_t(R(T::*p)())
            :pmf(p)
        {
        }//显式定义构造函数

        R operator() (T& X) const //重载() 接受T类型(引用)
        {
            return ((X.*pmf)()); //返回此指针所指的成员函数的指针, 也就是返回此功能
        }
};

    template <typename R,typename T>
my_mem_fun_ref_t<R,T> my_mem_fun_ref(R(T::*f)())//定义通用函数,接受成员函数指针为参数
{
    cout<<typeid(R).name()<<endl;
    return my_mem_fun_ref_t <R,T>(f);//返回由此指针所构造的函数对象,使之运作
}

int main()
{
    list <Shape> ilst;
    for (int i = 1; i != 10; ++i) {
        ilst.push_back(i);//没有显式定义,故int稳式转化为Shape
    }
    for_each(ilst.begin(), ilst.end(), my_mem_fun_ref(&Shape::draw));/*my_men_fun_ref_t<R, T>里面的R和T类型是由   my_mem_fun_ref(&Shape::draw)的返回类型和Shape提供的*/
    /*测试上面的&Shape::draw是做为my_mem_fun_ref的参数,从而进入   my_mem_fun_ref_t <R,T> (f);构造对像所用
      .此对像一旦构造成功,再传入参数   就是调用opertor()*/
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值