我之前已经问过类似的问题,但是现在我意识到这还不够具体。
我想做的是找出指向该类某个成员函数的两个指针,与该类的实际对象相结合,是否相等,因为它们都将“调用”(如下所述)同一个函数同一对象。基本上,在这段代码中:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
TSpecificFunctor<F> specFunc1(object1, fct1);
TSpecificFunctor<F> specFunc2(object2, fct2);
return /* Something */;
}
Run Code Online (Sandbox Code Playgroud)
是否存在/* Something */将返回trueiff specFunc1并specFunc2指向同一给定对象的相同成员函数的东西?
在那里,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;
};
Run Code Online (Sandbox Code Playgroud)
换句话说,该函数应返回trueiff ,其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
Run Code Online (Sandbox Code Playgroud)
您可以比较两个F实例的指针,也可以比较成员的指针。这样做是正确的:
bool isEqual(F* object1, void(F::*_fct1)(),
F* object2, void(F::*_fct2)())
{
return object1 == object2 && _fct1 == _fct2;
}
Run Code Online (Sandbox Code Playgroud)
实际是否按顺序调用一个或另一个会产生相同的结果状态是另一个问题。如果所讨论的成员函数没有副作用,就是这种情况。但是他们也可以修改全局或共享状态。
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |