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

Posted

技术标签:

【中文标题】是否可以通过模板指定抽象类变量类型?【英文标题】:Is it possible to specify abstract class variable type through a template? 【发布时间】:2019-06-13 06:58:06 【问题描述】:

在 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);

另一种方法是使用适当的模板类创建一个派生自GenericAnimal&lt;T1, T2, ...&gt; 的类Fish,但正如我所说,我想避免大量的类并通过独特的类/结构定义T1, T2, ... .

编辑:代码错字更正。

【问题讨论】:

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


解决来自 cmets 的后续问题

我们能否让Fish 类本身成为一个模板,派生自AnimalAttributes&lt;T1&gt;T1SubSpeciesEnum

这是不可能的,因为在基类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>

;

【讨论】:

SubSPeciesEnum 是所有 T 共享的公共类吗?我希望类型依赖于 T。Fish 只有与鱼类相关的亚种枚举。 @WebRoamer 这不是所有人共享的类型。与GenericAnimal 一起使用的每个T 必须包含一个名为SubSpeciesEnum 的嵌套类型,但每个T 可以是不同的类型。我会扩展答案。 是的,我就是这个意思,谢谢。还有一个问题:我们能否将 Fish 类本身作为模板,从 AnimalAttributes 派生,T1 是 SubSpeciesEnum?我尝试这样做,但收到关于标识符 SubSpeciesEnum 的 C2061 错误。

以上是关于是否可以通过模板指定抽象类变量类型?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse中在一个类中定义另一个类

继承抽象static

在 TypeScript 中为具有类型变量的抽象类中的派生类分配泛型类型

Java 类

java 定义类 如何写?

java 抽象类与接口