zoukankan      html  css  js  c++  java
  • boost::function库简介

    boost::function Boost.Function库用来提供一个对象化的函数指针,通过它可以很容易的将一个函数封装为仿函数。

    boost::function库可以支持自由函数,函数对象,类成员函数。而且参数个数多达10个。boost::function库利用模板技术来实现。生成的代码有很高的运行效率。首先我们还是以一个例子简单的说明它的用法:

    #include <iostream>
    #include <boost/function.hpp>

    using namespace std;

    float add(int x,float y)
    {
        return x + y;
    }

    int main()
    {
        boost::function<float (int x, float y)> f = &add;
        cout<<"add(3,2) is "<<f(3,2)<<endl;
    }

    在上面的例子中,

    定义了一个仿函数,它指向add函数。这个是一种比较容易理解的方式,也是boost推荐的写法,但有的编译器不支持(其实大多数主流编译器都支持)这种模板的语法,不支持的编译器包括:

    • Microsoft Visual C++ 6.0, 7.0
    • Borland C++ 5.5.1
    • Sun WorkShop 6 update 2 C++ 5.3
    • Metrowerks CodeWarrior 8.1

    如果你用了上述编译器,则应使用

    boost::function2<float, int, float> f;

    的形式。

    如果只是封装普通函数(功能类似函数指针),则使用方式和普通函数指针类似,可以直接通过"="来进行函数的封装,通过"()"来实现函数的调用。

    如果用它来封装成员函数(用函数指针来指向成员函数用起来可不是一般的恶心),可以通过如下两种方式:

    1. 通过boost::bind库实现。
    2. 通过stl库std::bind1st和std::mem_fun 函数组合实现。

    下面是一个简单的示例:

    struct X
    {
        bool foo(int a){ cout<<a<<endl; return false;}
    };

    int main()
    {
        boost::function<bool (int)> f;
        X x;

        f = std::bind1st(
            std::mem_fun(&X::foo), &x);
        f(5);
        

        f = boost::bind(&X::foo, &x, _1);
        f(5);
    }

    关于boost::bind库,后面将会写一篇文章来专门介绍,这里就不多讲了。

    boost::function对象还有一些成员函数,如containsclearempty,也是一些比较有用的函数,功能很简单,这里就不多介绍了。

  • 相关阅读:
    A. Two Semiknights Meet DFS
    Dummy Guy 几何
    Electrification Plan MST
    Parallel and Perpendicular 几何,数学
    A. Soroban 暴力+水题
    B. Fence 前缀和 水题
    Max Sum http://acm.hdu.edu.cn/showproblem.php?pid=1003
    亲和串 http://acm.hdu.edu.cn/showproblem.php?pid=2203
    N! http://acm.hdu.edu.cn/showproblem.php?pid=1042
    Let the Balloon Rise http://acm.hdu.edu.cn/showproblem.php?pid=1004
  • 原文地址:https://www.cnblogs.com/TianFang/p/1305022.html
Copyright © 2011-2022 走看看