获取指向列表中对象的永久指针

Get permanent pointer to object in list

我目前正在寻找一种在列表中拥有指向对象的永久指针的方法。我所说的永久是指一个指针,只要它存在,它就始终指向同一个对象。

我找不到任何简单的方法来做到这一点,所以有人知道吗?我已经在使用boost了,所以boost解决方案也是可以接受的。

为了更清楚地说明我需要什么,这里有一个例子:

std::map<int, std::list<void (*)()> > handlerList; // I store some callback functions like this

void addHandler( int id, void (*handlerFunc)() ) {
  handlerList[id].push_back(handlerFunc); // 100% intended behavior (I know that the []-operator creates a object if it doesn't exist)
}

我想要的是这样的:

some_permanent_pointer_type addHandler( int id, void (*handlerFunc)() ) {
  return handlerList[id].push_back(handlerFunc);
}

然后在其他时间:

some_permanent_pointer_type handlerPointer;

handlerPointer = addHandler( 123, someFunc );

// Other point of code

handlerPointer.delete(); // or
ListType.delete(handlerPointer); // Or something like this

有人知道吗?写我自己的 class 没什么大不了的。但我不知道如何实现这一点。但我更喜欢已经存在的东西。时间和东西。

注意:此代码将 运行 在 linux 机器上。

这是我快速拼凑的东西。目前,调用 destroy() 两次是错误的,但这是可以解决的。

#include <map>
#include <list>

std::map<int, std::list<void (*)()> > handlerList;

class HandleHandle {
    public:
        HandleHandle(std::list<void (*)()> &list, std::list<void (*)()>::iterator iterator):
            list_(list),
            iterator_(iterator)
        {}

        void destroy() {
            list_.erase(iterator_);
        }

    private:
        std::list<void (*)()> & list_;
        std::list<void (*)()>::iterator iterator_;
};

HandleHandle addHandler(int id, void (*handlerFunc)()) {
    handlerList[id].push_back(handlerFunc);
    return HandleHandle(handlerList[id], handlerList[id].rbegin().base());
}

void someFunc() {
}

int main() {
    auto handlerPointer = addHandler(123, someFunc);
    handlerPointer.destroy();
}

根据您所说的要求,您只需要

using funclist = std::list<void (*)()>;
std::map<int, funclist > handlerList; // I store some callback functions like this

funclist& addHandler( int id, void (*handlerFunc)() ) {
  handlerList[id].push_back(handlerFunc); // Creates list on demand
  return handlerList[id];
}

auto list5 = addHandler(5, &foo);
addHandler(5, &bar);
list5.clear(); // Clears entire handlerList[5], i.e. &foo and &bar.