在 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 fromAnimalAttributes<T1>
,T1
beingSubSpeciesEnum
?
那是不可能直接的,因为没有办法声明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/