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

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

编辑:代码拼写错误更正。

最佳答案

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

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必须在 header 中完全实现,或者在您的库中针对可以实例化的所有类型进行预专门化(并且客户端将无法将其与其他类型一起使用)。


解决评论中的后续问题

Can we have the Fish class be a template itself, deriving from AnimalAttributes<T1>, T1 being SubSpeciesEnum?

那是不可能直接的,因为没有办法声明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>
{
};

关于c++ - 是否可以通过模板指定抽象类变量类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56574941/

相关文章:

C++ Eigen : subclassed vector get error in conversion with simple operation

c++ - 无法与第三方库一起暂停线程

C++类设计题

c++ - 如何使用 C++ 的 ifstream 使用数据长度而不是换行符从文件中读取?

git diff 忽略文件中的模式

c# - 使用 MVVM 模式 C# 进行实时编辑

c++ - const_reference 或 map 的迭代器(当不实际迭代时)

dependency-injection - 用户输入依赖注入(inject)的最佳策略是什么?

java - 如何在Java中动态映射同一父类的子对象列表

java - 如 Effective Java 中所述,嵌套的 Builder 类真的是必需的吗?