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

时间:2019-06-13 06:58:06

标签: c++ design-patterns

在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, ...通过独特的类/结构。

编辑:代码错字更正。

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解您的问题,但这可能就是您想要的吗?

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>派生而来,T1SubSpeciesEnum吗?

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

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>
{
};