【问题标题】:constructor for inherited template class继承模板类的构造函数
【发布时间】:2019-12-14 09:47:26
【问题描述】:

在下面的代码中,我想保持继承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&lt;F&gt;。继承A&lt;F&gt;B 是否使B 也成为模板B&lt;F&gt;?我没有在B 的任何地方使用模板参数F,它只是从A 继承并使用B 作为A&lt;F&gt;::f1()

用户会将函数globalFunction 传递给模板化参数,因此class B : public A&lt;decltype(globalFunction)&gt; 不能使用。

【问题讨论】:

  • 只有当 B 不依赖于模板参数时,才能将其设为非模板。例如,class B : public A&lt;decltype(global_function)&gt;。否则出于显而易见的原因,它必须是模板。
  • 正在使用B 中的模板参数F 来指定它继承自的类A&lt;F&gt; 以及构造函数参数的类型。 (它不继承自AA 不是一个类,它是一个类模板。)
  • 您从模板类继承,因此显然您依赖于基类模板实例化的参数/类型。没有办法摆脱它(也不应该有)。
  • @SergeyA 类定义用户无法访问,因此来自class B : public A&lt;decltype(global_function)&gt;global_function 未知。还有其他选择吗?
  • 为什么A 是一个模板?

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


【解决方案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();
}

这对性能略有不利,因为您无法内联对函数指针的调用,但它确实根据要求摆脱了模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2019-12-14
    • 2015-08-06
    • 2018-09-29
    • 2013-09-04
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多