继承的模板类的构造函数

constructor for inherited template class

本文关键字:构造函数 继承      更新时间:2023-10-16

在下面的代码中,我想保留继承class B : public A<F>,但只想将globalFunction()传递给A并从B访问为A::f1((和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();
}

基本上我想避免BB<F>。继承A<F>B是否也会使B成为模板B<F>?我没有B任何地方F使用模板参数,它只是从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();
}

这对性能略有损害,因为您将无法对函数指针进行内联调用,但它确实会根据请求删除模板。