【问题标题】:std::function method reference unable to cast DWORD to DWORD64?std::function 方法引用无法将 DWORD 转换为 DWORD64?
【发布时间】:2018-07-25 06:40:23
【问题描述】:

我在引用 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

但是,这个可以,但看起来很丑。 (海事组织)

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

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

【问题讨论】:

  • 成员函数需要一个对象来调用它们。您要么需要制作静态来解决此问题,要么使用 lambda 或 std::bind 将对象绑定到函数。
  • @NathanOliver:回答部分...
  • @LightnessRacesinOrbit 是的,我认为有一个骗子,所以我发表了评论,然后去寻找骗子
  • 如果您认为存在欺骗,则根本不提供答案的标准回应,更不用说在错误的地方这样做了

标签: c++ winapi functional-programming


【解决方案1】:

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

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

问题是您试图获取成员函数的地址,然后将其塞入不需要指向成员函数的指针的类型中。

指向成员函数的指针很奇怪,因为在调用它们时需要绑定this 指针。在您的尝试中,调用myReference()(如果可能的话)没有任何意义。它会在哪个MyClass 对象上被调用?

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

或者,考虑这些函数是否真的需要对象状态;如果不是,它们可能是static(然后它们与非成员函数基本相同,出于我们的目的)。

【讨论】:

  • 非常感谢您的深入解释。 fun_64 和 fun_32 方法必须是成员函数,所以我想我会坚持使用 lambda。
  • @glf4k:你考虑过直接调用函数吗?我真的不明白您为什么需要通过std::function 往返,但我想我们看不到您的所有代码。
  • 是的,我考虑过,为每种情况(32 或 64)制作 if 语句会使代码更不可读。在 myReference 声明之后有很长的代码:}
  • @glf4k 但是只有一个分支点? if (use64) return fun_64(a); else return fun_32(a); 或者,如果您稍后需要该值,const DWORD64 val = (use64 ? fun_64(a) : fun_32(a));。除非std::function 解决方案与此处显示的不完全一样,否则很难看到它可以复杂多少
  • @glf4k: 最后一点,如果函数是本地的,那么写auto myReference = [=](...) { ... };'而不是将它存储在std::function&lt;&gt;中——它的性能就像代码是内联的一样.
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2018-02-26
  • 2014-12-11
  • 2017-07-08
相关资源
最近更新 更多