C++ 将函数指针作为参数传递

举报
福州司马懿 发表于 2024/06/30 15:31:23 2024/06/30
【摘要】 前言在C++中,你可以通过函数指针、函数对象(functor,即重载了operator()的类或者lambda表达式)或者std::function来传递函数作为参数。以下是这些方法的示例: 1. 函数指针首先,你需要定义一个函数,然后你可以创建一个指向这个函数的指针,并将这个指针作为参数传递给另一个函数。#include <iostream>// 定义一个函数void printHell...

前言

在C++中,你可以通过函数指针、函数对象(functor,即重载了operator()的类或者lambda表达式)或者std::function来传递函数作为参数。以下是这些方法的示例:

1. 函数指针

首先,你需要定义一个函数,然后你可以创建一个指向这个函数的指针,并将这个指针作为参数传递给另一个函数。

#include <iostream>

// 定义一个函数
void printHello() {
    std::cout << "Hello, World!" << std::endl;
}

// 定义一个接受函数指针作为参数的函数
void callFunction(void (*func)()) {
    func();
}

int main() {
    callFunction(printHello); // 传递函数名,它会被隐式转换为函数指针
    return 0;
}

2. 函数对象(也称为仿函数或functor)

函数对象是一个重载了operator()的类实例,它可以像函数一样被调用。

#include <iostream>

// 定义一个函数对象
class PrintHello {
public:
    void operator()() const {
        std::cout << "Hello, World!" << std::endl;
    }
};

// 定义一个接受函数对象作为参数的函数
void callObject(const PrintHello& obj) {
    obj(); // 调用函数对象
}

int main() {
    PrintHello hello;
    callObject(hello); // 传递函数对象实例
    return 0;
}

3. std::function

std::function是一个通用、多态的函数封装器。它允许你存储、复制和调用任何可调用的目标——函数、lambda表达式、bind表达式或其他函数对象,只要它们的签名兼容。

#include <iostream>
#include <functional>

// 定义一个简单的函数
void printHello() {
    std::cout << "Hello, World!" << std::endl;
}

// 定义一个接受std::function作为参数的函数
void callFunction(const std::function<void()>& func) {
    func();
}

int main() {
    // 直接传递函数
    callFunction(printHello);

    // 使用lambda表达式
    callFunction([]() {
        std::cout << "Hello from lambda!" << std::endl;
    });

    return 0;
}

在上面的例子中,std::function<void()>是一个类型,它表示接受没有参数并返回void的可调用对象。你可以使用任何与这个签名兼容的可调用对象来创建std::function的实例,并传递给callFunction函数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。