• C++11的function函数对象


    C++函数种类

    C++中的函数种类很多:

    • 函数
    • 函数指针
    • Lambda函数
    • bind创建的对象
    • 仿函数(重载了函数调用运算符的类)

    但这些函数可能共享一种调用方式。调用形式指明了调用返回的类型以及传递给调用的实参类型。比如:int(int, int);

    使用function

    std::function是一个通用的多态函数包装器,可以调用普通函数、Lambda函数、仿函数、bind对象、类的成员函数和指向数据成员的指针,function定义在名为function.h头文件中。是一个模板,在创建function实例时,必须指明类型,如:

    function<int(int, int)>
    

    这里声明了一个function类型,它可以表示接受两个int、返回一个int的可调用函数。

    以前的C的函数指针用法:

    int c_func(int a, int b)
    {
        return a + b;
    }
    
    int main(int argc, char** argv)
    {
        typedef int(*Func)(int, int);
        Func func = c_func;
        func(1, 2);
        return 0;
    }
    

    C++ 98的用法:

    struct Func
    {
    public:
        int operator() (int a, int b)
        {
            return a + b;
        }
    };
    
    int main(int argc, char** argv)
    {
        Func func;
        func(1, 2);
        return 0;
    }
    

    在C++11可以直接使用function。

    function与普通函数

    int Func(int a, int b)
    {
        return a + b;
    }
    
    int main(int argc, char** argv)
    {
        std::function<int(int, int)> func = Func;
        func(1, 2);
        return 0;
    }
    

    function与仿函数

    struct Func
    {
    public:
        int operator() (int a, int b)
        {
            return a + b;
        }
    };
    
    int main(int argc, char** argv)
    {
        Func func;
        std::function<int(int, int)> f = func;
        func(1, 2);
    }
    

    function与Lambda函数

    int main(int argc, char** argv)
    {
        auto fun = [](const int a, const int b) {return a + b; };
        std::function<int(int, int)> func = fun;
        fun(1, 2);
        return 0;
    }
    

    function与类的静态成员函数

    struct Func
    {
        static int Add(int a, int b)
        {
            return a + b;
        }
    };
    
    int main(int argc, char** argv)
    {
        function<int(int, int)> f = &Func::Add;
        f(1, 2);
        return 0;
    }
    

    function与bind函数调用类成员函数

    struct Func
    {
        int Add(int a, int b)
        {
            return a + b;
        }
    };
    
    int main(int argc, char** argv)
    {
        Func f;
        //指针形式调用成员函数
        function<int(int, int)> f1 = bind(&Func::Add, &f, _1, _2);
        f1(1, 2);
        //对象形式调用成员函数
        function<int(int, int)> f2 = bind(&Func::Add, f, _1, _2);
        f1(1, 2);
        return 0;
    }
    

    function调用共有数据成员

    struct Func
    {
        Func(int num) : m_num(num) {}
        int Add(int a, int b)
        {
            return a + b;
        }
        int m_num;
    };
    
    int main(int argc, char** argv)
    {
        Func f(2);
        function<int(const Func&)> f1 = &Func::m_num;
        std::cout << f1(f) << std::endl;    //2
        return 0;
    }
    

    function与类模板和函数模板

    template<typename T>
    struct Func
    {
        static int Add(T a, T b){ return a + b; }
        int Add2(T a, T b){ return a + b; }
    };
    
    template<typename T>
    T Add(T a, T b)
    {
        return a + b;
    }
    
    int main()
    {
        //类模板
        Func<int> f1;
        function<int(int, int)> f2 = bind(&Func<int>::Add2, &f1, _1, _2);
        function<int(int, int)> f3 = &Func<int>::Add;
        //函数模板
        function<int(int, int)> f4 = Add<int>;
        return 0;
    }
    
  • 相关阅读:
    基于visual c++之windows核心编程代码分析(33)实现防火墙模型
    基于visual c++之windows核心编程代码分析(31)SNMP协议编程
    未来的职业?
    关于 Delphi 中流的使用(8) 压缩与解压缩的函数
    Delphi 中的 XMLDocument 类详解(2) 记要
    Delphi 中的 XMLDocument 类详解(1) 等待研究的内容
    关于 Delphi 中流的使用(5) 组件序列化
    关于 Delphi 中流的使用(6) 用流读写结构化文件
    xml 语法提示
    关于 Delphi 中流的使用(4) 遍历读取流中的所有数据
  • 原文地址:https://www.cnblogs.com/WindSun/p/13082312.html
Copyright © 2020-2023  润新知