【C++基础概念理解——std::invoke()函数基础知识】

std::invoke定义

std::invoke C++17 引入的一个标准库函数,用于通用地调用可调用对象(如函数指针、成员函数指针、函数对象、lambda 表达式等)。它提供了一种统一的方式来调用这些可调用对象,而不需要关心它们的具体类型。

功能

std::invoke 可以调用以下类型的可调用对象:

  1. 普通函数和函数指针:

    int func(int a) { return a; }
    std::invoke(func, 42); // 等价于 func(42)
    
  2. 成员函数指针:

    struct Foo {
        int member_func(int a) { return a; }
    };
    Foo foo;
    std::invoke(&Foo::member_func, foo, 42); // 等价于 foo.member_func(42)
    
  3. 成员变量指针:

    struct Foo {
        int member_var;
    };
    Foo foo{42};
    std::invoke(&Foo::member_var, foo); // 等价于 foo.member_var
    
  4. 函数对象和 lambda 表达式:

    auto lambda = [](int a) { return a; };
    std::invoke(lambda, 42); // 等价于 lambda(42)
    

示例

以下是一些使用 std::invoke 的示例:

#include <iostream>
#include <functional>

int func(int a) {
    return a;
}

struct Foo {
    int member_func(int a) {
        return a;
    }
    int member_var;
};

int main() {
    // 调用普通函数
    std::cout << std::invoke(func, 42) << std::endl; // 输出 42

    // 调用成员函数
    Foo foo;
    std::cout << std::invoke(&Foo::member_func, foo, 42) << std::endl; // 输出 42

    // 访问成员变量
    foo.member_var = 42;
    std::cout << std::invoke(&Foo::member_var, foo) << std::endl; // 输出 42

    // 调用 lambda 表达式
    auto lambda = [](int a) { return a; };
    std::cout << std::invoke(lambda, 42) << std::endl; // 输出 42

    return 0;
}

总结

std::invoke 提供了一种统一的方式来调用各种类型的可调用对象,使得代码更加简洁和通用。

std::invoke(std::forward<F>(f), **this); 用于调用传入的 lambda 函数或其他可调用对象,并将当前对象的值作为参数传递给它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值