访问使用不同模板参数实例化的模板化类的成员

时间:2010-07-30 17:53:42

标签: c++ inheritance templates

我的主项目类是模板化类,用:

声明
template<int dim, typename typ>

其中 dim 是维数(2或3), typ 是浮点数据类型(浮点数或双精度数)。根据这些参数,此类的实例具有特定类型的成员,矢量(数学)具有 dim 组件数。

因此实例可以在成员类型上有所不同,并且它们的函数在参数类型上有所不同,但它们都具有相同的函数排列...可以对运行时进行什么操作,即一般访问使用不同类创建的此类实例的函数模板参数???

1 个答案:

答案 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>BaseTypBase都是抽象类(包含至少一个未实现的虚方法),它是 DimBaseTypBase使用DimBase而非Basevirtual public继承的基本,否则您将获得“dreaded diamond