C++11 function类模板

1、 std::function

类模板 std::function 是一个通用的多态函数包装器。当做函数指针。

2、function类模板

1 template< class R, class... Args >
2 class function< R (Args...)>

说明:R是被调用函数的返回类型 Args....是被调用的函数的形参。

function是类模板,只有成员函数,没有数据成员。

3、用法

3.1 调用普通函数

#include <functional>
#include <iostream>
int f(int a, int b)
{
  return a+b;
}
int main()
{
    std::function<int(int, int)>func = f;
    cout<<func(1, 2)<<endl;      // 3
    system("pause");
    return 0;
}

说明:模板类必须实例化使用,上面实例化后对象名 func,对象func可以指向的函数是有两个int参数,返回值是int的函数,函数f满足。调用也只需func( 1,2 )实现调用。

3.2 调用函数对象

#include<iostream>
using namespace std;

//function object
struct functor
{
public:
    int operator() (int a, int b)
    {
        return a + b;
    }
};
int main()
{
   functor ft;
   function<int(int,int)> func = ft();
   cout<<func(1,2)<<endl;    //3
   return 0;
}

3.3 调用模板函数对象

#include<iostream>
using namespace std;

//function object
template<class T>
struct functor
{
public:
    T operator() (T a, T b)
    {
        return a + b;
    }
};
int main()
{
   functor ft;
   function<int(int,int)> func = ft<int>();
   cout<<func(1,2)<<endl;    //3
   return 0;
}

3.4 调用lambda表达式

#include <functional>
#include <iostream>
using namespace std;
int main()
{
    auto f = [](const int a, const int b) {return a + b; };
    std::function<int(int, int)>func = f;
    cout << func(1, 2) << endl;      // 3
    system("pause");
    return 0;
}

3.5 调用类静态成员函数

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    static int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
    function<int(int, int)> f = &Plus::plus;
    cout << f(1, 2) << endl;     //3
    system("pause");                                       
    return 0;
}

3.6 调用类成员函数

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
    Plus p;
    function<int(Plus&,int, int)> f = &Plus::plus;
  //function<int(const Plus,int, int)> f = &Plus::plus;
    cout << f(p,1, 2) << endl;     //3
    system("pause");                                       
    return 0;
}

3.7 调用类公有数据成员

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
    Plus(int num_):num(num_){}
    public:
        int plus(int a, int b)
        {
            return a + b;
        }
       int  num;
};

int main()
{
    const Plus p(2);
    function<int(const Plus&)> f = &Plus::num;
  //function<int(const Plus)> f = &Plus::num;
    cout << f(p) << endl;     //2
    system("pause");                                       
    return 0;
}

3.8 通过bind函数调用类成员函数

#include <iostream>
#include <functional>
using namespace std;

class Plus
{
public:
    int plus(int a, int b)
    {
        return a + b;
    }
};

int main()
{
   Plus p;
   // 指针形式调用成员函数
   function<int(int, int)> f = bind(&Plus::plus, &p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符
   // 对象形式调用成员函数
   function<int(int, int)> f1 = bind(&Plus::plus, p, placeholders::_1, placeholders::_2);// placeholders::_1是占位符
   cout << f(1, 2) << endl;     //3
   cout << f1(1, 2) << endl;     //3
   system("pause");                                       
   return 0;
}

参考:

博客 [ https://blog.csdn.net/qq_35721743/article/details/83217416?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight ]
原文链接: https://www.cnblogs.com/wulingchao/p/13474118.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/201382

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午8:46
下一篇 2023年2月12日 下午8:46

相关推荐