c++11学习笔记(2)- std::function

原创
2022-11-23
4599
1
std::function 是一个 函数包装模板 ,用来存储、转移、调用目标函数,包括普通函数、类的成员函数、lambda表达式、仿函数等。如果std::function未包裹任何可调用的元素,则会抛出std::bad_function_call 异常。

下面是一个关于std::function的使用的一个简单的示例

首先我们定义几个函数:

// 普通函数
void printFunc(int number)
{
    std::cout << __FUNCTION__ << " " << number << std::endl;
}

class Foo
{
public:
    // 非静态成员函数
    void addFunc(int number) {
        std::cout << __FUNCTION__ << " " << number + m_Number << std::endl;
    }

    // 静态成员函数
    static void staticFunc(int number) {
        std::cout << __FUNCTION__ << " " << number << std::endl;
    }
    int m_Number = 10;
};

// 仿函数
class ObjectFunc
{
public:
    void operator() (int number){
        std::cout << __FUNCTION__ << " " << number << std::endl;
    }
};

下面是关于函数的调用:

// 普通函数
std::function<void(int)> f1 = printFunc;
f1(10);

// lambda表达式
std::function<void(int)> f2 = [](int n) {
    std::cout << __FUNCTION__ << " " << n << std::endl;
};
f2(10);

Foo foo;
// 类的非静态成员函数(对象调用)
std::function<void(int)> f3_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f3_2 = std::bind(&Foo::addFunc, foo, 20);
f3_1(10);
f3_2();

// 类的非静态成员函数(指针调用)
std::function<void(int)> f4_1 = std::bind(&Foo::addFunc, foo, std::placeholders::_1);
std::function<void()> f4_2 = std::bind(&Foo::addFunc, foo, 20);
f4_1(10);
f4_2();

// 带固定参数
std::function<void()> f5 = std::bind(printFunc, 100);
f5();

// 类的静态函数
std::function<void(int)> f6 = &Foo::staticFunc;
f6(100);

// 仿函数
std::function<void(int)> f7 = ObjectFunc();
f7(100);

运行结果如下:
printFunc 10
main::::operator () 10
Foo::addFunc 20
Foo::addFunc 30
Foo::addFunc 20
Foo::addFunc 30
printFunc 100
Foo::staticFunc 100
ObjectFunc::operator () 100

不会飞的纸飞机
扫一扫二维码,了解我的更多动态。

下一篇文章:c++11学习笔记(3)- 左值、右值和右值引用