将原始问题放在底部。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