美文网首页
C++类重载函数的function和bind使用

C++类重载函数的function和bind使用

作者: 风之谷rr | 来源:发表于2020-09-03 23:56 被阅读0次

C++类重载函数的function和bind使用

在没有C++11的std::function和std::bind之前,我们使用函数指针的方式是五花八门,结构很繁琐难懂。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。

1.std::function简介

std::function首先是可调用对象,本质上生成了一个类(仿函数)

简单的使用如下代码

#include <unordered_map>

#include <iostream>

#include <functional>

usingnamespacestd;

intfunc(inta)

{

    cout<<a<<__FUNCTION__<<endl;

    returna;

}

intmain()

{

    usingNewType=function<int(int)>;// function本质上生成了一个类(仿函数)

    NewTypef1=func;

    f1(55);

    return0;

}

2.std::function与std::bind联合使用绑定类成员函数

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

将可调用对象和其参数绑定成一个防函数;

只绑定部分参数,减少可调用对象传入的参数。

一个简单的例子:

#include <unordered_map>

#include <iostream>

#include <functional>

using namespace std;

class A

{

public:

    int funcA(int a)

    {

        cout << "111 " << a << endl;

        return 1;

    }

};

int main()

{

    A a;

    using NewType = function; // function本质上生成了一个类(仿函数)

    NewType f1 = bind(&A::funcA, &a, std::placeholders::_1);

    f1(55);

    return 0;

}

3.std::function与std::bind联合使用绑定类成员重载函数

绑定类成员重载函数的难点在于如何区分函数绑定的是哪一个成员函数。这时需要在函数指针前指定其类型。下面是一个简单的例子:

#include <unordered_map>

#include <iostream>

#include <functional>

using namespace std;

class A

{

public:

    int funcA(int a)

    {

        cout << "111 " << a << endl;

        return 1;

    }

    int funcA(int a, int b)

    {

        cout << "222 " << a << endl;

        return a + b;

    }

};

int main()

{

    unordered_map funcMap;//尝试将其转载入map中

    A g;

    using NewType1 = function;

    using NewType2 = function;

    NewType1* type1 = new NewType1; // function本质上生成了一个类(仿函数)

    NewType2* type2 = new NewType2;

    //获取重载函数指针

    *type1 = std::bind((int(A::*)(int, int)) & A::funcA, &g, std::placeholders::_1, std::placeholders::_2);

    *type2 = std::bind((int(A::*)(int)) & A::funcA, &g, std::placeholders::_1);

    //

    funcMap[1] = type1; //

    funcMap[2] = type2; //

    // 使用

    void* s1 = funcMap[1];

    void* s2 = funcMap[2];

    NewType1* f1 = (NewType1*)(s1);

    NewType2* f2 = (NewType2*)(s2);

    (*f1)(1,5);

    (*f2)(55);

    return 0;

}

最近在工作中,遇到了需要编写大量重复代码的工作,于是尝试将这些重载函数放入映射中,只需要添加注册函数,最终可以统一使用映射表调用所需要的函数,function与bind方法给了我帮助,我也将代码分享给大家。

相关文章

  • C++类重载函数的function和bind使用

    C++类重载函数的function和bind使用 在没有C++11的std::function和std::bind...

  • C++ 中几种调用对象

    C++中一共有5种调用对象:函数,函数指针,重载了函数调用运算符的类(仿函数),bind创建的对象 和 lambd...

  • 2020-07-06----《C++类的学习》

    函数重载:同名不同参。 C++类的特点:封装、继承、多态。 //多态与函数重载是啥关系? 虚函数:和软件架构相关 ...

  • JavaScript中apply、call和bind区别与联系

    一、相似点 apply、call和bind 都是Function类下prototype的共有函数,即所有函数都有。...

  • C++的重载

    C++允许函数和运算符多个定义,当重载函数或者重载运算符被调用的时候,编译器将决定使用的参数类型与定义函数中参数类...

  • c++11特性

    std::function 将可调用的函数或者函数指针等,封装成类使用 std::bind 注意其参数是拷贝的方式...

  • 1.2.19_C++ 函数调用运算符 () 重载

    C++ 重载运算符和重载函数 函数调用运算符 () 可以被重载用于类的对象。当重载 () 时,您不是创造了一种新的...

  • 运算符重载与友元函数

    运算符重载 C++允许将运算符重载到用户定义的类型,例如,使用+将两个类对象相加。 重载运算符要使用运算符函数: ...

  • 1.2.21_C++ 类成员访问运算符 -> 重载

    C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针...

  • pybind11—类(继承,重载,枚举)

    前言 在C++类中, 继承, 函数重载是重要的特征。 继承 重载 overloadpy::overload_cas...

网友评论

      本文标题:C++类重载函数的function和bind使用

      本文链接:https://www.haomeiwen.com/subject/ckgssktx.html