在下面的代码中,我想保留继承class B : public A<F>,但只想将globalFunction()传递给A,并以A :: f1()和A :: fa()的形式从B访问。我怎样才能做到这一点?

#include <iostream>

void globalFunction()
{ }

//passing function to class A from main()
template<typename F>
class A
{
public:
    F f1;
    A(F fun1) : f1(fun1) {}
    void fa() {  f1();  } ;
};


template<typename F>
class B : public A<F>
{
public:
    B (F fun2) : A<F>(fun2) {}
    void fb() ;
};

template<typename F>
void B<F>::fb() { A<F>::f1(); }

int main()
{
    A obja(globalFunction);
    obja.fa();
    B objb(globalFunction);
    objb.fb();
}


基本上,我想避免将B设置为B<F>。将A<F>继承到B是否会使B成为模板B<F>?我不在F中的任何地方使用模板参数B,它只是从A继承而来,并且从B作为A<F>::f1()使用

用户将函数globalFunction传递给模板参数,因此,不能使用class B : public A<decltype(globalFunction)>

最佳答案

如果您知道函子类型将始终是某个签名的函数,则可以完全摆脱模板:

void globalFunction()
{ }

//passing function to class A from main()

class A
{
public:
    using fptr_t = void (*)();
    fptr_t f1;
    A(fptr_t fun1) : f1(fun1) {}
    void fa() {  f1();  } ;
};


class B : public A
{
public:
    B (fptr_t fun2) : A(fun2) {}
    void fb() ;
};

void B::fb() { A::f1(); }

int main()
{
    A obja(globalFunction);
    obja.fa();
    B objb(globalFunction);
    objb.fb();
}


这将对性能造成少许损害,因为您将无法内联调用函数指针,但确实会按要求删除模板。

关于c++ - 继承的模板类的构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57382831/

10-11 22:46
查看更多