继承的模板类的构造函数

时间:2019-08-06 19:31:54

标签: c++ class templates c++17

在以下代码中,我想保留继承class B : public A<F>,但只想将globalFunction()传递给A并以A :: f1()从B访问和A :: fa()。我该怎么办?

#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)>

1 个答案:

答案 0 :(得分:1)

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

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();
}

这对性能略有不利,因为您将无法内联调用函数指针,但确实会按要求删除模板。