我的主项目类是模板化类,用:
声明template<int dim, typename typ>
其中 dim 是维数(2或3), typ 是浮点数据类型(浮点数或双精度数)。根据这些参数,此类的实例具有特定类型的成员,矢量(数学)具有 dim 组件数。
因此实例可以在成员类型上有所不同,并且它们的函数在参数类型上有所不同,但它们都具有相同的函数排列...可以对运行时进行什么操作,即一般访问使用不同类创建的此类实例的函数模板参数???
答案 0 :(得分:3)
这正是继承的目的。您可以创建一个通用的非模板纯虚基类,用于定义所有模板使用的接口,例如:
class Base {
public:
virtual ~Base() {};
virtual void foo() = 0;
virtual int bar(int param) = 0;
// Etc, for whatever other methods you want
};
然后从中派生出你的模板:
template<int dim, typename typ>
class Dervied : public Base
{
public:
virtual ~Derived();
virtual void foo();
virtual int bar(int param);
// Etc, for whatever other methods you want
private:
std::vector<typ> data;
};
当然,实现Derived
模板的方法。然后,您可以通过指向Derived
的指针或引用来访问Base
的任何实例化。例如:
void callFoo(const Base& b)
{
b.foo();
}
int main()
{
Derived<3,float> d_f3;
Derived<2,double> d_d2;
callFoo(d_f3);
callFoo(d_d2);
return 0;
}
从您的描述中可以看出,Derived
的所有实例化中可能存在一些共同的方法,但有些方法依赖于模板参数,例如
void addNumber(typ number);
在这种情况下,您无法将此功能提升到Base
,因为在Derived<n,float>
上调用此方法是没有意义的。如果某些函数依赖于类型而某些函数依赖于数字,那么您可以创建封装这些想法的基类,如下所示:
class Base
{ /* All methods independent of template parameters */ };
template <int dim> DimBase : virtual public Base
{ /* All methods dependent only on the dimension parameter */ };
template <typename typ> TypBase : virtual public Base
{ /* All methods dependent only on the type parameter */ };
template<int dim, typename typ>
Derived : public DimBase<dim>, public TypBase<typ>
{ /* All methods */ };
这将允许您使用Base
指针或引用调用任何独立方法,使用DimBase<n>
指针或引用调用任何依赖于维度的方法,并使用{调用任何类型相关方法{1}}指针或引用。
请注意,在上文中,建议TypBase<T>
,Base
和TypBase
都是抽象类(包含至少一个未实现的虚方法),它是 DimBase
和TypBase
使用DimBase
而非Base
从virtual public
继承的基本,否则您将获得“dreaded diamond”