【Boost】boost::function紹介

1981 ワード

1.紹介    Boost.Functionライブラリには、クラスの関数オブジェクトのパッケージが含まれています.その概念は広義のコールバック関数に似ている.関数ポインタと同じ特性を持つが、呼び出しインタフェースも含まれている.1つの関数ポインタは、場所で呼び出されるか、コールバック関数として機能することができる.boost.functionは、関数ポインタの代わりに、より大きな柔軟性を提供することができる.2.使用    Boost.Functionには2つの形式がある:boost::functionf    使用タイプ:一般関数、メンバー関数、関数オブジェクト.    functionを使用する場合、empty関数または0と比較して、有効な関数を指すかどうかを判断できます.functionが有効な関数を指さない場合、呼び出し時にbad_が放出されます.function_コールの異常.functionのclear関数は、function自体が空の場合、関数を呼び出しても問題はありません.
3.例
int fsum(int i, int j)
{
    return i + j;
}

class Person
{
public:
    void operator() (std::string name, int age)
    {
        std::cout << name << ": " << age << std::endl;
    }
};

class Car
{
public:
    Car(){}
    virtual ~Car(){}
    void info(int i)
    {
        std::cout << "info = " << i << std::endl;
    }
};

void test_function()
{
    // 1.     
    boost::function<int(int, int)> func1;
    func1 = fsum;
    std::cout << "4 + 5 = " << func1(4, 5) << std::endl;

    // 2.     
    boost::function<void(std::string, int)> func2;
    Person person;
    func2 = person;
    func2("myname", 30);

    // 3.     
    boost::function<void(Car*, int)> func3;
    func3 = &Car::info;
    Car car;
    func3(&car, 25);

    // 4.    
    boost::function<int(int, int)> func4;
    assert(func4.empty());
    assert(!func1.empty());
    func1.clear();
    assert(func1.empty());
    try
    {
        func1(4, 5);
    }
    catch (std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}