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

glf*_*f4k 0 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;
};
Run Code Online (Sandbox Code Playgroud)

一个fun(DWORD64)实现:

DWORD64 MyClass::fun(DWORD64 a64bitparam) {

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

}
Run Code Online (Sandbox Code Playgroud)

该示例将不会编译为"操作数类型不兼容".某种程度上该程序无法投射DWORDDWORD64.

但是,这个确实如此,但看起来很难看.(IMO)

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

有人可以简单地解释一下我在方法参考中做错了什么吗?

Lig*_*ica 6

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

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

问题是您正在尝试获取成员函数的地址,然后将其推送到不期望指向成员函数的指针的类型中.

由于需要this在调用指针时绑定指针,因此指针到成员函数是奇怪的动物.在你的尝试中,调用myReference()(如果可能的话)没有任何意义.MyClass它会被调用哪个对象?

你最好使用lambda(正如你已经展示过的那样),或者std::bind你必须这样做.

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