可以比较两个指向成员函数的指针是否相等吗?
Can two pointers to member functions be compared for equality?
我之前已经问过,但现在我意识到它不够具体。
我想做的是找出两个指向 class 的某个成员函数的指针,结合 class 的实际对象是否相等,因为两者都将 "call"(在下面描述的意义上)相同对象的相同功能。基本上,在这段代码中:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
TSpecificFunctor<F> specFunc1(object1, fct1);
TSpecificFunctor<F> specFunc2(object2, fct2);
return /* Something */;
}
如果 specFunc1
和 specFunc2
指向同一个给定对象的同一个成员函数,是否有 /* Something */
return true
?
那里,TSpecificFunctor
定义如下:
class TFunctor
{
public:
virtual void call() = 0;
};
template <class TClass> class TSpecificFunctor : public TFunctor
{
public:
TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)())
{
pt2Object = _pt2Object;
fpt=_fpt;
}
virtual void call() override
{
(*pt2Object.*fpt)();
}
private:
void (TClass::*fpt)();
TClass* pt2Object;
};
换句话说,函数应该 return true
当且仅当 specFunc1.call()
将产生与 specFunc2.call()
.
完全相同的结果
编辑:例如,这可能是我正在努力实现的应用:
class TClassB {
public:
TClassB() {...}
void doSomething()
{
...
}
void doSomethingElse()
{
...
}
private:
/* Some object-specific stuff. */
};
TClassB test;
isEqual(&test, &TClassB::doSomething, &test, &TClassB::doSomething); // ==> true
isEqual(&test, &TClassB::doSomething, &test, &TClassB::doSomethingElse); // ==> false
您可以比较指向 F
个实例的两个指针,也可以比较指向成员的指针。这是正确的做法:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
return object1 == object2 && _fct1 == _fct2;
}
是否实际调用一个或另一个以产生相同结果状态的顺序是另一个问题。如果有问题的成员函数没有副作用,就是这种情况。但他们也可以修改全局或某种共享状态。
我之前已经问过
我想做的是找出两个指向 class 的某个成员函数的指针,结合 class 的实际对象是否相等,因为两者都将 "call"(在下面描述的意义上)相同对象的相同功能。基本上,在这段代码中:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
TSpecificFunctor<F> specFunc1(object1, fct1);
TSpecificFunctor<F> specFunc2(object2, fct2);
return /* Something */;
}
如果 specFunc1
和 specFunc2
指向同一个给定对象的同一个成员函数,是否有 /* Something */
return true
?
那里,TSpecificFunctor
定义如下:
class TFunctor
{
public:
virtual void call() = 0;
};
template <class TClass> class TSpecificFunctor : public TFunctor
{
public:
TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)())
{
pt2Object = _pt2Object;
fpt=_fpt;
}
virtual void call() override
{
(*pt2Object.*fpt)();
}
private:
void (TClass::*fpt)();
TClass* pt2Object;
};
换句话说,函数应该 return true
当且仅当 specFunc1.call()
将产生与 specFunc2.call()
.
编辑:例如,这可能是我正在努力实现的应用:
class TClassB {
public:
TClassB() {...}
void doSomething()
{
...
}
void doSomethingElse()
{
...
}
private:
/* Some object-specific stuff. */
};
TClassB test;
isEqual(&test, &TClassB::doSomething, &test, &TClassB::doSomething); // ==> true
isEqual(&test, &TClassB::doSomething, &test, &TClassB::doSomethingElse); // ==> false
您可以比较指向 F
个实例的两个指针,也可以比较指向成员的指针。这是正确的做法:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
return object1 == object2 && _fct1 == _fct2;
}
是否实际调用一个或另一个以产生相同结果状态的顺序是另一个问题。如果有问题的成员函数没有副作用,就是这种情况。但他们也可以修改全局或某种共享状态。