在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, ...
通过独特的类/结构。
编辑:代码错字更正。
答案 0 :(得分: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
作为模板,必须在标头中完全实现,或者必须在您的库中针对可以实例化它的所有类型进行预专业化(并且客户端不会能够与其他类型一起使用。
要解决评论中的后续问题
我们可以将
Fish
类本身作为模板,从AnimalAttributes<T1>
派生而来,T1
是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>
{
};