【问题标题】:templates and pointers to member functions模板和指向成员函数的指针
【发布时间】:2015-02-19 14:49:33
【问题描述】:

我想使用和处理指向某个成员函数的指针,并且我还希望能够调用该(或其他)成员函数。 可以说,我有这样的标题:

class A{
  public:
  template<class T> void Add(bool (T::*func)(), T* member){
    ((member)->*(func))();
  }
};
class B{
  public:
  bool Bfoo(){return 1;}
  void Bfoo2(){
    A a;
    a.Add(Bfoo, this);
  }
};

和这样的 cpp:

main(){
  B f;
  f.Bfoo2();
}

我有以下错误:

main.h(22) : 错误 C2784: 'void __thiscall A::Add(bool (__thiscall T::*)(void),T *)' : 无法推断“重载”的模板参数 函数类型'来自'重载的函数类型'

我需要从许多类中调用 A::Add(并发送有关类方法及其实例的信息),这就是我想使用模板的原因

使用 Microsoft Visual C++ 6.0。我究竟做错了什么?我不能使用 boost。

【问题讨论】:

  • 这可能吗?将方法分配给普通函数指针?我会为此使用std::function(C++11 标准)周围的东西。但你不能,因为你只能使用蹩脚的编译器。

标签: c++ templates


【解决方案1】:

在我看来,做你需要的正确方法是使用继承,例如:

class A {
  virtual void Add() = 0;
}

class B : public A {
  void Add() {...}
}

class C : public A {
  void Add() {...}
}

所以在你的主要你可以这样做:

A* a = new B();
a->Add(); /* this call B::Add() method */

【讨论】:

    【解决方案2】:

    你需要传递函数的地址

    a.Add(&B::Bfoo, this);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2010-09-13
      • 2012-07-05
      • 1970-01-01
      • 2023-03-28
      • 2011-12-09
      • 2012-05-21
      相关资源
      最近更新 更多