c++ - 继承模板类的构造函数

标签 c++ class templates c++17

在下面的代码中,我想保留继承 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();
}

基本上我想避免制作 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/

相关文章:

c++ - 如何使用继承形成一个通用的回调函数指针?

c++ - 静态模板化 constexpr 嵌套类成员

c++ - 混合可变参数模板值和可变参数推导类型

可变序列 : How to create similar code block for each argument/type? 的 C++ 模板和代码生成

c# - 如何使标签静态化

c++ - 参数化模板方法的显式实例化

c++ - 模板类返回元组或值,取决于参数包

c++ - 为什么我可以在方法中使用 'this'

c++ - 我如何管理内存?点云库

c++ - 从 friend 类调用析构函数