【发布时间】:2015-03-10 14:00:24
【问题描述】:
我目前正在寻找一种在列表中拥有指向对象的永久指针的方法。永久是指一个指针,只要它存在,它就始终指向同一个对象。
我找不到任何简单的方法,所以有人有想法吗?我已经在使用 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 机器上运行。
【问题讨论】:
-
你不能这样做,因为列表是可变的。如果列表发生变化,其对象在内存中的位置可能会发生变化。您已经可以通过 id 查找处理程序列表,因此您可以在需要时获取它。每当我看到这样的问题时,我发现最好的办法就是退后一步,问问你想做什么,因为答案并不在这条路上。
-
你在找delegates?
-
@FelixCastor 代表是 C++/CX,与常规 C++ 不同。
-
@mbgda 我看不到任何其他方法可以简单地删除基本上任何给定的处理程序。由于其中一些需要在一段时间后删除。
-
@BrainStone,此类问题的常见解决方案是返回一个唯一令牌(通常只是一个 int 或 uint),用于标识特定的 id 和回调对。当您需要删除它时,您可以说
myListType.Delete(token)- 您的列表对象将找到与唯一令牌对应的条目并将其删除。
标签: c++ list pointers object boost