是否可以通过模板指定抽象类变量类型

Is it possible to specify abstract class variable type through a template?

本文关键字:抽象 抽象类 类变量 类型 可以通过 是否      更新时间:2023-10-16

在API上下文中,我想最小化用户可用的类。为此,我想概括一下他可以访问的数据类型,但专门化输入数据。

我想到了模板。但是,我来自 C# 世界,我不习惯C++世界中模板的可能性和限制。

下面是一些伪代码:

GenericAnimal<T>
bool setSubSpecies(T.EnumOfSubSpecies subSpecies)
GenericAnimal<Fish> cod;
cod.setSubSpecies(Fish.FishSubSpeciesEnum.Cod);
GenericAnimal<Mammal> cetacean;
cetacean.setSubSpecies(Mammal.MammalSubSpeciesEnum.Cetaceans);

另一种方法是创建一个类Fish,该类派生自具有适当模板类的GenericAnimal<T1, T2, ...>,但正如我所说,我想避免大量的类,并通过唯一的类/结构定义T1, T2, ...

编辑:代码错别字更正。

我不确定我是否完全理解您的问题,但这也许是您要找的吗?

template <class T>
class GenericAnimal
{
public:
  bool setSubSpecies(typename T::SubSpeciesEnum)
  {
    // code here
  }
};

class Fish
{
public:
  enum SubSpeciesEnum {
    Cod, Salmon, Carp
  };
};
class Mammal
{
public:
  enum SubSpeciesEnum {
    Cetaceans, Canids, Felines
  };
};

GenericAnimal<Fish> cod;
cod.setSubSpecies(Fish::SubSpeciesEnum::Cod);
GenericAnimal<Mammal> cetaceans;
cod.setSubSpecies(Mammal::SubSpeciesEnum::Cetaceans);

当然需要注意的是,作为一个模板,GenericAnimal必须在标头中完全实现,或者预先在您的库中专门用于可以实例化的所有类型(客户端将无法将其与其他类型一起使用(。


从评论中解决后续问题

我们可以让Fish类本身是一个模板,从AnimalAttributes<T1>派生,T1 SubSpeciesEnum

这不可能直接实现,因为在基类AnimalAttributes中使用之前无法声明Fish::SubSpeciesEnum。但是,存在解决方法,例如引入中间基类:

class FishEnum
{
public:
  enum SubSpeciesEnum {
    Cod, Salmon, Carp
  };
};
template <class EnumClass>
class AnimalAttributes : public EnumClass {
public:
  using typename EnumClass::SubSpeciesEnum;
};
class Fish : public AnimalAttributes<FishEnum>
{
};