首页 > 编程语言 >【C++基础概念理解——std::invoke()函数基础知识】

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

时间:2024-09-13 11:51:05浏览次数:3  
标签:std 调用 invoke int C++ member func

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 函数或其他可调用对象,并将当前对象的值作为参数传递给它。

标签:std,调用,invoke,int,C++,member,func
From: https://blog.csdn.net/XWWW668899/article/details/142204010

相关文章

  • C++17新特性探索:拥抱std::optional,让代码更优雅、更安全
    std::optional背景在编程时,我们经常会遇到可能会返回/传递/使用一个确定类型对象的场景。也就是说,这个对象可能有一个确定类型的值也可能没有任何值。因此,我们需要一种方法来模拟类似指针的语义:指针可以通过nullptr来表示没有值。解决方法是定义该对象的同时再定义一个附加的......
  • 分享一些程序员常用的C++知识点
    以下是一些C++中的常用知识点:一、基础语法数据类型基本数据类型:整型(int):用于表示整数,通常占用4个字节(32位系统)。例如:intnum=10;浮点型(float、double):用于表示小数,float精度较低,double精度较高。如floatf=3.14f;(注意f后缀表示float类型),doubled=3.1415926......
  • C++入门基础
    个人主页:Jason_from_China-CSDN博客所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客前言 这一篇章算是C++栏目的语法的第一篇章,主要是为类和对象打下基础,介绍一些C++基本的语法结构这里提醒一下,要是看不懂第一步创建文件的,其实更建议先学习一下C语言,因为C++的......
  • Qt C++设计模式->建造者模式
    建造者模式简介建造者模式(BuilderPattern)是一种创建型设计模式,它通过使用多个简单的对象一步步构建一个复杂对象。建造者模式允许你分步骤创建复杂对象,并且你可以控制每个步骤如何执行。该模式常用于对象的创建过程非常复杂且需要有多个可选参数的场景。建造者模式的应用场......
  • VSCode配置C++环境
    前言VSCode作为一款“宇宙级”的编辑软件,为用户提供了丰富的插件。本文是一片保姆级关于VSCode配置C++环境教程;步骤一:MinGW安装MinGW(MinimalistGNUforWindows)是一款在Windows平台使用的开发工具集,提供了C/C++编译工具。MinGW下载地址:WinLibs-适用于Windows的GCC+Mi......
  • C++创建与调用dll动态链接库
    C++创建与调用dll动态链接库(MinGW64Dev-C++)本文使用的是dev-c++,如果涉及到VC++中不一样的操作,也会适当进行区分。项目一:创建DLL1、创建一个DLL类型的项目,当前命名为dlltest,并选择合适的路径进行保存。 2、在生成的预设置代码中,加入如下代码//这是头文件dll.h#ifndef_D......
  • C/C++ 学生管理系统的文件读取与写入
    代码中文件读取函数read_file()存在一些问题,望指出.`#includeincludedefineSIZE100usingnamespacestd;staticintnums_stu=0;typedefstructStudent{char*name;char*ID; //占10个字符doublescore_one;doublescore_two;doublescore_three;doubletota......
  • C++中的基本运算符----逻辑运算符(&&、||、!)的实例讲解
    在C++中,逻辑运算符用于处理布尔值(true和false),并用于复合条件的判断。主要的逻辑运算符包括:目录1.逻辑与运算符(&&):2.逻辑或运算符(||):3.逻辑非运算符(!):1.逻辑与运算符(&&):当且仅当两个操作数都为true时,结果才为true。示例:if(a>0&&b>0)下面......
  • C++插件管理系统
    插件加载目录结构execute   plug.exe   plugify.dll   plugify.pconfig   res      cpp-lang-module.pmodule      example_plugin.pplugin      bin         cpp-lang-module.dll         exampl......
  • C++---string类常见接口
    介绍 string类详情===>>>https://cplusplus.com/reference/string/string/?kw=string1.string是表示字符串的字符串类(感觉就像一个动态的字符数组)2.该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3.string在底层实际是:basic_string模......