zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    错误滚动条eclipse快速定位到错误处
    路径原因linux下tomcat无法启动
    提示命令命令行将U盘文件系统转换成ntfs
    客户传真第四部分 个人理财风险防范8.当心银行汇款引发的诈骗
    请求错误[Python]网络爬虫(三):异常的处理和HTTP状态码的分类
    范围元【2013 GDCPC】有为杯 广东ACM省赛小总结
    编程程序国外程序员的BASIC情结——我的编程生涯始于BASIC
    执行取消利用timer实现的倒计时
    文件分析IDA反汇编/反编译静态分析iOS模拟器程序(二)加载文件与保存数据库
    安全业务第四部分 个人理财风险防范9.取款也要加小心
  • 原文地址:https://www.cnblogs.com/WindSun/p/13082312.html
Copyright © 2011-2022 走看看