【问题标题】:Can I use method pointers in c++ alike delegates in c#?我可以在 c# 中使用 c++ 中的方法指针吗?
【发布时间】:2013-06-22 07:54:10
【问题描述】:

我想让一个类'(为方便起见,我们称它为 X)方法能够使用指向其自己方法的指针,以防我能够提取仅因调用的方法而异的代码。

例如,有几个块:

a();
b();
c();
MehtodCall(someResultOfabc);
d();
e();

我想提取一个只使用作为指针传递的不同方法的方法:

所以我想要类似的东西:

void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
    a();
    b();
    c();
    this->*MethodCallPointer(someResultOfabc);
    d();
    e();
}

并以这种方式使用这个功能:

void X::DoSomethingA(){
    ExtractedMethod(&X::ADoer);
}
void X::DoSomethingB(){
    ExtractedMethod(&X::BDoer);
}

和操作系统...

不幸的是,我被困在这里,因为我收到一个编译错误,即方法指针没有计算为采用一个参数的方法调用。

如果原因是 X 在此声明中仍然是一个不完整的类型,我开始徘徊?

如果有人能帮助我告诉我该怎么做,或者为什么不可能这样做,我会很高兴。

我真正非常不想要的是获得一些解决方法,例如在签名和 lambda 中使用 std::function,或者使用指向采用 X* 并调用我需要的特定方法的静态方法的指针, 也没有制作 switch 语句和标志, 也没有代替 switch 语句使用接口, 实现策略模式并使用策略的静态实例作为参数;) 这些并不是这种情况下的所有解决方法, 但我仍然没有想了解其他解决方法。我唯一感兴趣的就是以这种方式“有可能,以及如何做到”。

【问题讨论】:

  • X::ADoerX::BDoer的签名是什么?
  • 不叫“方法”,在C++里叫“成员函数”。
  • @Griwes method 是一个通用的、与语言无关的 OOP 概念。该概念清楚地映射到 C++ 的成员函数,因此即使在 C++ 中也可以完美地使用该术语。 ;)
  • @syam,这不是一个正确的 C++ 术语,讨论是关于 C++。 C++ 是标准化的,一个标准术语是成员函数,所以使用它。当讨论是通用的时,可能会使用通用术语,但当讨论是特定的时,您应该始终使用特定的术语。而且,由于它在 C++ 的上下文中没有很好地定义,因此变得模棱两可。
  • @Griwes:下次请不要再说什么。我使用了一个通用词,所以我的意思毫无疑问。争论将它们命名为“方法”或“成员函数”在本主题中没有任何意义。如果你想就那个话题争论,那么请创建你自己的“问题”,这样你就可以在那里争论不存在的问题,而不是在这里发垃圾邮件。提前谢谢你。

标签: c++ class pointers methods


【解决方案1】:

@Robert 是对的,在 C++ 中使用委托的惯用方式是使用 std::functionstd::bind

但是,如果您坚持使用指向方法的指针作为适当委托的解决方法,那么正确的语法是:

void X::ExtractedMethod( void(X::*MethodCallPointer)(TypeOfABCResult) ){
    (this->*MethodCallPointer)(someResultOfabc);
//  ^                        ^
//  note the parentheses, they are required

【讨论】:

  • @syam: 啊,我错过了那些括号.. 现在我明白为什么它没有编译了。这正是我所要求的:) 在我使用这种方法失败后,我确实使用了 std::function 和 lambda。我让自己这样做,因为“做所有事情”方法是私有的。但我必须说,我也喜欢这个带有 boost::bind 的解决方案,因为它看起来更优雅。
【解决方案2】:

在 C++ 中你可以使用 boost bind 来绑定函数调用:

void X::DoSomethingA(){
    ExtractedMethod( boost::bind(&X::ADoer, pInstance) );
}

如果 X::ADoer 不是 X 类的静态成员,则需要 pInstance。

对于函数类型,您可以使用 std::function(最新的 C++)或 boost::function。

typedef std::function< void(TypeOfABCResult) > MyDelegateType;

void X::ExtractedMethod( MyDelegateType delegate ) { ... }

这不是一种解决方法。这就是你在 C++ 中的工作方式,它的工作方式与在 C# 中使用委托的工作方式非常相似。

【讨论】:

  • 从问题来看,他似乎不想想要绑定实例。
  • 在这种情况下,他可能并不确切知道自己要的是什么,或者他的解决方案架构不正确,他问错了问题;)
猜你喜欢
  • 2021-12-14
  • 2020-11-26
  • 1970-01-01
  • 2023-03-05
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多