使用从列表向量中提取的地址调用函数,列表是函数的地址

Call a function with the address extracted from vector of lists, lists are address of functions

提问人:chandu 提问时间:8/31/2023 更新时间:8/31/2023 访问量:36

问:

#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++ 列表 向量 函数指针

评论

2赞 molbdnilo 8/31/2023
addNumber_t是一个变量,而不是一个类型。 将其声明为类型别名。typedef void (*addNumber_t)(int, int);
0赞 Some programmer dude 8/31/2023
从技术上讲(根据规范)是否可以使用指针指向函数?IIRC 不是,指向函数的指针与指向数据或对象的一般指针是不同的东西。void*
2赞 Jean-Baptiste Yunès 8/31/2023
typedef std::list<void *> funcList;?如果丢失了函数的类型,您将如何调用函数?+@Someprogrammerdude 备注。
1赞 Some programmer dude 8/31/2023
你为什么用于结构?C++ 中的 A 就像 一样,结构(或类)标签名称也是一个类型名称。通常,避免使用令人困惑的关键字来创建类型别名,而应使用 .如(但请记住我之前的评论)typedefstructclasstypedefusingusing funcList = std::list<void*>;
0赞 paddy 8/31/2023
@Someprogrammerdude我想是的。如果我没记错的话,普通的函数指针确实适合指针,而指向成员函数的指针是特殊的,不一定适合(尽管在实践中它倾向于)。

答: 暂无答案