gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:10:20 25 4
gpt4 key购买 nike

我的主要项目类是模板类,声明为:

template<int dim, typename typ>

dim 是维数(2 或 3),typ 是 float 据类型(float 或 double)。基于这些参数,此类的实例具有特定类型的成员, vector (数学)具有 dim 个组件。

所以实例在成员类型上可以不同,它们的函数在参数类型上也不同,但它们都有相同的函数排列......可以在运行时做些什么,即一般访问用不同创建的此类实例的函数模板参数 ???

最佳答案

这正是继承的目的。您创建一个通用的、非模板的、纯虚拟的基类来定义所有模板使用的接口(interface),例如:

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> 调用任何维度相关的方法指针或引用,以及任何使用 TypBase<T> 的依赖于类型的方法指针或引用。

请注意,在上面,建议 Base , TypBaseDimBase都是抽象类(至少包含一个未实现的虚拟方法),必不可少 TypBaseDimBase继承自 Base使用 virtual public而不仅仅是 public ,否则你会得到“dreaded diamond

关于c++ - 访问使用不同模板参数实例化的模板类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com