是否可以通过模板指定抽象类变量类型
Is it possible to specify abstract class variable type through a template?
在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
必须在标头中完全实现,或者预先在您的库中专门用于可以实例化的所有类型(客户端将无法将其与其他类型一起使用(。
从评论中解决后续问题
我们可以让
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>
{
};
相关文章:
- 如何定义一个纯抽象基类
- 将抽象基类中的所有纯虚函数定义为 varaidaic 模板
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- 用c++中的纯虚拟方法抽象模板类
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 如何抽象接口类
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- 从抽象基类中获取重载函数
- 如何构建一个 Map,其中键是抽象基类(而不是值)
- 无法调用纯抽象基类超载
- 私下继承C++抽象基类是什么意思
- 将抽象派生类对象存储在基类向量中
- 如何在抽象基类中实现运算符+
- 如何为抽象基类创建模板实例化?
- 如何从其抽象母类上的指针初始化子类?
- 崩溃 __cxxabiv1::__cxa_pure_virtual () - vtable ptr 到抽象基类
- CRTP - 是否可以创建一个抽象基类?