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

C++ 是否可以通过模板指定抽象类变量类型?,c++,design-patterns,C++,Design Patterns,在API上下文中,我希望最小化用户可用的类。为此,我想概括他可以访问的数据类型,但专门化输入数据 我想到了模板。但是,我来自C++世界,我不习惯C++世界中模板的可能性和限制。 下面是一些伪代码: GenericAnimal<T> bool setSubSpecies(T.EnumOfSubSpecies subSpecies) GenericAnimal 布尔集合亚种(T.EnumOfSubSpecies亚种) GenericAnimal cod; 鳕鱼亚种(鱼、鱼亚种、鳕鱼)

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

我想到了模板。但是,我来自C++世界,我不习惯C++世界中模板的可能性和限制。 下面是一些伪代码:

GenericAnimal<T>
bool setSubSpecies(T.EnumOfSubSpecies subSpecies)
GenericAnimal
布尔集合亚种(T.EnumOfSubSpecies亚种)
GenericAnimal cod;
鳕鱼亚种(鱼、鱼亚种、鳕鱼);
普通鲸目动物;
鲸目动物亚种(哺乳动物亚种鲸目动物);
另一种方法是创建一个类
Fish
,该类派生自
GenericAnimal
,并使用适当的模板类,但正如我所说的,我希望避免大量的类,并通过一个独特的类/结构定义
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);

subspecienum
是所有T的共同类吗?我希望类型依赖于T。Fish只会有与鱼类相关的亚种的枚举。@WebRoamer这不是所有鱼类共享的类型。与
GenericAnimal
一起使用的每个
T
必须包含一个名为
subspecienum
的嵌套类型,但对于每个
T
,它可以是不同的类型。我将扩大答案。是的,这就是我的意思,谢谢。还有一个问题:我们能让Fish类本身成为一个模板吗?它来自动物属性,T1是亚种?我尝试这样做,但是得到了一个关于标识符亚种数的C2061错误。
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);
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>
{
};