0
点赞
收藏
分享

微信扫一扫

React高级特性之context

得一道人 2023-10-15 阅读 24

C++笔记之通用多态函数包装器std::function

code review!

文章目录

1.存储自由函数,lambda,std::bind 调用的结果

在这里插入图片描述

代码

#include <functional>
#include <iostream>

void print_num(int i) {
    std::cout << i << '\n';
}

int main() {
    std::cout << "存储自由函数---1" << std::endl;
    std::function<void(int)> f_display = print_num;
    f_display(-9);

    std::cout << "存储 lambda--2" << std::endl;
    std::function<void()> f_display_42 = []() { print_num(42); };
    f_display_42();

    std::cout << "存储到 std::bind 调用的结果--3" << std::endl;
    std::function<void()> f_display_31337 = std::bind(print_num, 31337);
    f_display_31337();
}

运行:
存储自由函数—1
-9
存储 lambda–2
42
存储到 std::bind 调用的结果–3
31337

2.存储到成员的调用

在这里插入图片描述

代码

#include <functional>
#include <iostream>

struct Foo {
    Foo(int num) : num_(num) {}
    void print_add(int i) const { std::cout << num_ + i << '\n'; }
    int num_;
};

int main() {

    const Foo foo(314159);
    foo.print_add(1);

    std::cout << "存储到成员函数的调用---1" << std::endl;
    std::function<void(const Foo &, int)> f_add_display = &Foo::print_add;

    f_add_display(foo, 1);
    f_add_display(314159, 1);

    std::cout << "存储到数据成员访问器的调用---2" << std::endl;
    std::function<int(Foo const &)> f_num = &Foo::num_;
    std::cout << "num_: " << f_num(foo) << '\n';

    std::cout << "存储到成员函数及对象的调用---3" << std::endl;
    using std::placeholders::_1;
    std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);
    f_add_display2(2);
}

运行:
314160
存储到成员函数的调用—1
314160
314160
存储到数据成员访问器的调用—2
num_: 314159
存储到成员函数及对象的调用—3
314161

3.存储到函数对象

在这里插入图片描述

#include <functional>
#include <iostream>

struct PrintNum {
    void operator()(int i) const {
        std::cout << i << '\n';
    }
};

int main() {
    // 存储到函数对象的调用
    std::function<void(int)> f_display_obj = PrintNum();
    f_display_obj(18);

    auto factorial = [](int n) {
        // 存储 lambda 对象以模拟“递归 lambda ”,注意额外开销
        std::function<int(int)> fac = [&](int n) { return (n < 2) ? 1 : n * fac(n - 1); };
        // note that "auto fac = [&](int n){...};" does not work in recursive calls
        return fac(n);
    };
    for (int i{5}; i != 8; ++i) {
        std::cout << i << "! = " << factorial(i) << ";  ";
    }
}

代码:
18
5! = 120; 6! = 720; 7! = 5040;

四.基本语法

在这里插入图片描述

五.使用std::function定义函数对象

在这里插入图片描述

六.使用std::function结合Lambda表达式定义函数对象

在这里插入图片描述

七.使用std::function实现回调机制——略,有专门新开笔记介绍。

举报

相关推荐

0 条评论