【问题标题】:Can two pointers to member functions be compared for equality?可以比较两个指向成员函数的指针是否相等吗?
【发布时间】: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 */;
}

如果specFunc1specFunc2 指向同一个给定对象的同一个成员函数,是否有/* 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。只需检查指针的值即可比较地址

标签: c++ c++11 functor


【解决方案1】:

您可以比较两个指向F 实例的指针,也可以比较指向成员的指针。这是正确的:

bool isEqual(F* object1, void(F::*_fct1)(), 
             F* object2, void(F::*_fct2)())
{
    return object1 == object2 && _fct1 == _fct2;
}

是否实际调用一个或另一个以产生相同的结果状态是另一个问题。如果有问题的成员函数没有副作用,就是这种情况。但他们也可以修改全局或以某种方式共享的状态。

【讨论】:

  • 如果这行得通,那就太简单了……我马上试试。当然,我不是问实际结果,我只是想知道调用的函数是否相等。
  • 令人尴尬的简单解决方案总是最好的:)
  • 有效!谢谢!! :-) 虽然我已经尝试过了,但我的实际代码更复杂,所以我可能做错了什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 2013-10-08
  • 1970-01-01
相关资源
最近更新 更多