C++函数指针std::function,实现在class中调用外部函数

分析

代码中定义了两个主要的类:myFunctionMyClass

  1. myFunction 是一个结构体,包含三个成员:namefuncdescriptionname 是函数的名称;func 是一个函数指针,指向一个接受一个 int 类型参数的函数;description 是函数的描述。
  2. MyClass 是一个类,它包含一个 std::vector,用于存储 myFunction 类型的函数。这个类提供了两个方法:funcRegistercallMyfunc
    • funcRegister 方法用于注册一个函数。它接受三个参数:函数的名称、一个指向函数的指针,以及一个可选的描述。然后,它将这三个值封装到一个 myFunction 结构体中,并将其添加到 myFunctions 向量中。
    • callMyfunc 方法用于调用名为 name 的函数,并传递参数 arg。它首先遍历 myFunctions 向量,查找是否有一个与给定名称匹配的函数。如果找到了该函数,就调用它;否则,输出一条错误消息。

main 函数中,我们创建了一个 MyClass 的对象 obj,并使用 funcRegister 方法注册了两个函数:一个使用lambda表达式,另一个使用普通函数指针。然后,我们调用这两个函数,并传递不同的参数。

代码实现

#include <iostream>
#include <functional>  // for std::function
#include <string>

// 定义一个结构体,用于存储函数信息:名称、函数指针和描述
struct myFunction {
    std::string name;
    std::function<void(int)> func;
    std::string description;
};

class MyClass {
public:
    std::vector<myFunction> myFunctions;  // 存储myFunction类型的函数

    MyClass() {}  // 构造函数

    // 注册函数的方法
    void funcRegister(const std::string& name, std::function<void(int)> func, const std::string& description = "") {
        myFunction myfunc;
        myfunc.name = name;
        myfunc.func = func;
        myfunc.description = description;
        myFunctions.push_back(myfunc);  // 将myfunc添加到myFunctions向量中
    }

    // 调用函数的方法
    void callMyfunc(const std::string& name, int arg) {
        for (const auto& func : myFunctions) {  // 遍历myFunctions向量
            if (func.name == name) {  // 找到与给定名称匹配的函数
                func.func(arg);  // 调用该函数
                return;
            }
        }
        std::cout << "Function " << name << " not found." << std::endl;  // 如果没有找到该函数,输出错误消息
    }
};

// 定义一个普通函数,用于测试
void externalFunc(int arg) {
    std::cout << "Called external function with argument: " << arg << std::endl;
}

int main() {
    MyClass obj;

    // 使用lambda表达式注册函数
    obj.funcRegister("externalFunc1", [](int arg) {
        std::cout << "Called external function with argument: " << arg << std::endl;
    });
    obj.callMyfunc("externalFunc1", 42);  // 调用该函数,并传递参数42

    // 使用普通函数指针注册函数
    obj.funcRegister("externalFunc2", externalFunc);
    obj.callMyfunc("externalFunc2", 17);  // 调用该函数,并传递参数17

    return 0;
}
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值