是否可以通过模板指定抽象类变量类型?
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<T1, T2, ...>
的类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<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>
;
【讨论】:
SubSPeciesEnum
是所有 T 共享的公共类吗?我希望类型依赖于 T。Fish 只有与鱼类相关的亚种枚举。
@WebRoamer 这不是所有人共享的类型。与GenericAnimal
一起使用的每个T
必须包含一个名为SubSpeciesEnum
的嵌套类型,但每个T
可以是不同的类型。我会扩展答案。
是的,我就是这个意思,谢谢。还有一个问题:我们能否将 Fish 类本身作为模板,从 AnimalAttributes以上是关于是否可以通过模板指定抽象类变量类型?的主要内容,如果未能解决你的问题,请参考以下文章