提问人:chandu 提问时间:8/31/2023 更新时间:8/31/2023 访问量:36
使用从列表向量中提取的地址调用函数,列表是函数的地址
Call a function with the address extracted from vector of lists, lists are address of functions
问:
#include <list>
#include <vector>
#include <mutex>
typedef std::list<void *> funcList;
typedef struct {
funcList* functionsList;
char* listName;
}ListAccess_t;
namespace FuncListManager{
//namespace {
std::vector<funcList> funcBuffer;
std::mutex funcMutex;
// }
static size_t findEmptyList() {
for (size_t index = 0; index < funcBuffer.size(); index++) {
if (funcBuffer[index].empty()) {
return index;
}
}
return funcBuffer.size();
}
size_t getAvalableListIndex() {
std::lock_guard<std::mutex> lock(funcMutex);
if (funcBuffer.size() != findEmptyList()) {
return findEmptyList();
}
else {
return -1;
}
}
void addFunction(size_t listIndex, void* func) {
std::lock_guard<std::mutex> lock(funcMutex);
funcBuffer[listIndex].push_back(func);
}
void removeFunction(size_t listIndex, void* func) {
std::lock_guard<std::mutex> lock(funcMutex);
if (listIndex < funcBuffer.size()) {
auto& myFuncList = funcBuffer[listIndex];
auto it = std::find(myFuncList .begin(), myFuncList .end(), func);
if (it != myFuncList .end()) {
myFuncList .erase(it);
}
}
}
void createFunctionList(size_t capacity) {
std::lock_guard<std::mutex> lock(funcMutex);
funcBuffer.resize(capacity);
}
funcList* getFunctionListPointer(size_t listIndex) {
std::lock_guard<std::mutex> lock(funcMutex);
if (listIndex < funcBuffer.size()) {
return &funcBuffer[listIndex];
}
return nullptr;
}
}
void (*addNumber_t)(int a, int b);
void addnumber(int a, int b) {
int c = a + b;
}
int main() {
FuncListManager::createFunctionList(5);
size_t index = FuncListManager::getAvalableListIndex();
addNumber_t = &addnumber;
FuncListManager::addObserver(index, (void*)&addnumber);
ListAccess_t *listAccess = new ListAccess_t();
listAccess->functionsList= FuncListManager::getObserverListPointer(index);
listAccess->listName = "list access";
ObserverList *list = listAccess->functionsList;
for (auto& func: *list) {
((addNumber_t)func)(1,2); //how to call add function here
int i = 0;
}
FuncListManager::removeFunction(index, (void*)&addnumber);
return 0;
}
我必须创建列表向量,每个列表都是函数地址的集合(用函数指针引用)。 如何调用添加到列表向量中的函数?
我不想使用类,它是命名空间下的库。
我试图从列表中调用提取的函数,但它抛出了编译错误。
答: 暂无答案
上一个:C++ 迭代器引用不存在的值
下一个:小数据的链表
评论
addNumber_t
是一个变量,而不是一个类型。 将其声明为类型别名。typedef void (*addNumber_t)(int, int);
void*
typedef std::list<void *> funcList;
?如果丢失了函数的类型,您将如何调用函数?+@Someprogrammerdude 备注。typedef
struct
class
typedef
using
using funcList = std::list<void*>;