【发布时间】:2019-08-12 11:21:51
【问题描述】:
我之前已经问过similar question,但现在我意识到它不够具体。
我想要做的是找出指向某个类的某个成员函数的两个指针与该类的实际对象相结合是否相等,因为两者都将“调用”(在下面描述的意义上)同一个对象的同一个功能。基本上,在这段代码中:
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 */ 将返回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;
};
换句话说,如果specFunc1.call() 将产生与specFunc2.call() 完全相同的结果,函数应该返回true。
编辑:例如,这可能是我想要实现的应用程序:
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
【问题讨论】:
-
首先你想知道是否调用了相同的方法,然后调用是否产生相同的结果。严格来说,这两者并不相同。我想这是你想要的第一个
-
如果你想检查相同的 code 被调用,那你为什么不检查地址指针呢?如果你想为相同的code检查相同的result,那么你不能在编译时这样做(除非方法是
constexpr),因为每个方法都可能是不确定的(有副作用)。 -
只是检查是否调用了相同的代码。抱歉,如果不清楚。我添加了一个我尝试做的示例。
-
@Duke 好吧,那么我想 same code 将位于 same address。只需检查指针的值即可比较地址