繁体   English   中英

将成员 Function 指针传递到模板中

[英]Passing Member Function Pointer into a Template

首先对标题混淆感到抱歉。 这是我的 OOP 设置。 我有 base class Base,还有两个纯虚函数 add 和 multi。 然后我派生了类 D1 和 D2,并实现了 add 和 multi 函数。 我想要一个模板 function,它可以灵活地在 D1 D2 和调用添加或多功能之间切换。 我四处搜索,有人说我应该使用 function 指针,但其他人说它不适用于纯虚函数。

class Base
{ double data; //data member
  Base(double d):data(d){}; 
  virtual double add() = 0; 
  virtual double multi() = 0; 
}
class D1::public Base
{ D1(double d): Base(d) {}; //calling base class constructor
  double add() {return data+1;} ;
  double multi() {return data*2;} ;
}
class D2::public Base
{ D2(double d): Base(d) {}; //calling base class constructor
  double add() {return data+3;} ;
  double multi() {return data*4;} ;
}
//now I want to have a template function that give me flexibility to construct D1 or D2 and calling add or multi.
template <typename T, typename F> 
void testFun(double num)
{ T tmp(num); //create object either D1 or D2;
  cout << T->F() << endl; //calling either add or multi;
}
int main()
{ testFun<D1, D1.add()>(double x = 5); 
//i know passing in D1.add() is wrong i don't know how to fix, hopefully you know what I am trying to achieve
  return 0;}

任何帮助将不胜感激。 谢谢你们。

虚成员函数并没有使指向成员函数的指针不起作用。 如果调用的 object 是指向具有实际实现的 object 的指针/引用,则可以调用指向纯虚拟 function 的指针。

看起来您一开始就对如何传递指向成员函数的指针的语法感到困惑。

另请注意,虚拟分派甚至不会在这里使用,因为所使用的 object 的类型在编译时是已知的。

template <typename T> 
void testFun(double num, double (T::*fn)())
{
    T tmp(num);
    std::cout << (tmp.*fn)() << std::endl;
}

这里, fn是指向T的成员 function 的指针,它不接受 arguments 并返回一个double精度值。 您可以像这样调用它:

testFun<D1>(5, &D1::add);

请注意您提供的示例代码的其他一些错误:

  • 当您应该使用:时,您可以使用::指定基本类型。 例如: class D1: public Base
  • 您使用class但从不指定访问修饰符,这意味着所有成员都是隐式的private 出于演示的目的,将它们更改为struct (默认为public访问)可以解决此问题。
  • 在类/结构定义之后需要一个分号。

这是工作代码的演示


为了完整起见,这里有一个演示,显示您可以使用指向纯虚拟成员 function 的指针来调用派生类型的引用/指针。 必须通过Base的引用调整代码以使用D1D2 object,以便动态调度。 这个例子看起来像:

template <typename T> 
void testFun(double num, double (Base::*fn)())
{
    T tmpConcrete(num);
    Base & tmp = tmpConcrete;
    std::cout << (tmp.*fn)() << std::endl;
}

int main() {
    testFun<D1>(5, &Base::add);
}

(当然,当通用代码知道T是什么时,这里使用指向Base成员的指针有点愚蠢,但它证明了这是可能的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM