我目前正在寻找一种在列表中拥有指向对象的永久指针的方法。永久性的意思是指一直指向同一个对象的指针。
我找不到任何简单的方法,所以有人有想法吗?我已经在使用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机器上运行。
答案 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.