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

时间:2015-01-12 18:07:27

标签: c++ list pointers object 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

有人有什么想法吗?写我自己的课不会那么多。但我不知道如何实现这一目标。但我更喜欢现有的东西。时间和东西。

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

2 个答案:

答案 0 :(得分:2)

这是我快速抛在一起的东西。目前,两次调用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();
}

答案 1 :(得分:0)

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

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.