將原始問題放在底部。C++將函數指針轉換爲唯一的「散列」鍵
我想我明白你們現在在說什麼 - 因爲成員函數指針的內部結構是編譯器/機器特定的,所以我真的不可能這樣做。所以即使它在我測試它的時候工作 - 我不能保證它會在其他編譯器/機器上。
有沒有另外一種方法可以解決我想要的問題?
我有一個模板類和該類的基本模板類,並且我有一個委託類,它包含調用時委託類應調用的所有事件的std :: map。
我需要一張地圖的原因是,既要確保同一個成員函數(指向成員函數的事件)不會更多地增加一次,並使得使用對象和成員從地圖中移除事件成爲可能函數最初在實例化事件對象時使用。
template <class T_arg1> struct EventBase1
{
public:
bool operator < (const EventBase1 &event1) const { return _key < event1._key; };
virtual void operator()(T_arg1 t1) const {};
std::pair<intptr_t, intptr_t> _key;
};
template <class T, class T_arg1> struct Event1: public EventBase1<T_arg1>
{
template <class T_arg1> friend class Delegate1;
typedef typename void (T::*Method)(T_arg1);
private:
Method _method;
T* _object;
public:
Event1(T* object, Method method): _object(object), _method(method)
{
_key = std::pair<intptr_t, intptr_t>(reinterpret_cast<intptr_t>(object), reinterpret_cast<intptr_t>(reinterpret_cast<void*&>(method)));
};
virtual void operator()(T_arg1 t1) const {
(_object->*_method)(t1);
};
};
template <class T_arg1> class Delegate1
{
public:
typedef typename EventBase1<T_arg1> T_event;
void operator += (T_event* observer)
{
assert(observer);
_observers[*observer] = observer;
};
void operator -= (const T_event &observer)
{
std::map<T_event, T_event*>::iterator i = _observers.find(observer);
if(i != _observers.end()) {
delete i->second;
_observers.erase(i);
}
};
void operator()(T_arg1 t1)
{
for(std::map<T_event, T_event*>::iterator i = _observers.begin(); i != _observers.end(); i++) {
(*(i->second))(t1);
}
};
private:
std::map<T_event, T_event*> _observers;
};
原題:
我存儲函數指針在std::map
,和我生成我的鑰匙了圖如下:std::pair<int, int>((int)((int*)object), (int)(static_cast<const void*>(&method)))
。
method
是一個函數(方法)指針,而object
是一個指向該方法對象的指針。
它的作品,但我有一個偷偷摸摸的懷疑,我得到的第二部分的關鍵是不完全正確的。
我從來沒有完全理解函數指針,但我想我得到的是指針的地址,而不是函數的地址,編譯器不會讓我這樣做,如((int)(static_cast<const void*>(method)))
。
所以我的問題是 - 如何從函數指針獲取唯一鍵,如果我稍後從另一個指向相同方法的函數指針獲取鍵,該怎麼辦?
由於提前, 馬丁
「方法是一個函數(方法)指針」 - 最好顯示代碼而不是描述它。我有一個偷偷摸摸的懷疑,它實際上是一個指向成員函數'R(T :: *方法)(A1,A2,A3)'的指針。 – MSalters 2012-08-16 08:29:03
指向 - 是的,它是一個指向成員函數的指針 - 我將編輯我的問題。 – Martin 2012-08-16 09:21:31
改爲存儲'std :: function <>'可能更簡單。 – MSalters 2012-08-16 09:23:52