分析
代码中定义了两个主要的类:myFunction
和 MyClass
。
myFunction
是一个结构体,包含三个成员:name
、func
和description
。name
是函数的名称;func
是一个函数指针,指向一个接受一个int
类型参数的函数;description
是函数的描述。MyClass
是一个类,它包含一个std::vector
,用于存储myFunction
类型的函数。这个类提供了两个方法:funcRegister
和callMyfunc
。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;
}