获取指向列表中对象的永久指针
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.
我目前正在寻找一种在列表中拥有指向对象的永久指针的方法。我所说的永久是指一个指针,只要它存在,它就始终指向同一个对象。
我找不到任何简单的方法来做到这一点,所以有人知道吗?我已经在使用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.