std :: function方法引用无法将DWORD转换为DWORD64?

时间:2018-02-14 16:05:30

标签: c++ winapi functional-programming

我无法引用我的MyClass课程的成员函数。请把这个抽象视为我的问题。

class MyClass {
   public:

   DWORD fun_32(_In_ DWORD64 a64bitparam); //wants DWORD64 returns DWORD
   DWORD64 fun_64(_In_ DWORD64 a64bitparam); //wants DWORD64 returns DWORD64

   DWORD64 fun(_In_ DWORD64 a64bitparam);

   private:
   BOOLEAN use64;
};

fun(DWORD64)实施:

DWORD64 MyClass::fun(DWORD64 a64bitparam) {

   std::function<DWORD64(DWORD64)> myReference;
   myReference = this->use64 ? &MyClass::fun_64 : &MyClass::fun_32;

}

该示例不会编译为“操作数类型不兼容”。不知何故,该程序无法将DWORD投射到DWORD64

然而,这个确实如此,但看起来很难看。 (IMO)

std::function<DWORD64(DWORD64)> myReference;
myReference = [this](DWORD64 a) -> DWORD64 { return use64 ? fun_64(a) : fun_32(a);};

有人可以简单地向我解释一下我对方法参考的错误吗?

1 个答案:

答案 0 :(得分:6)

  

该示例不会编译为&#39;操作数类型不兼容&#39;。不知何故,该程序无法将DWORD转换为DWORD64。

不,这不是正在发生的事情。

问题是你正在尝试获取成员函数的地址,然后将其推入一个不期望指向成员函数的类型。

指针到成员函数是奇怪的野兽,因为在调用它们时需要绑定this指针。在你的尝试中,调用myReference()(如果可能的话)没有任何意义。将调用哪个MyClass对象?

你最好使用lambda(正如你已经展示的那样),或者std::bind如果必须的话。

或者,考虑这些函数是否实际需要对象状态;如果没有,它们可以是static(然后它们基本上与非成员函数相同,为了我们的目的)。