gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:46:47 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com