Я не уверен, что полностью понимаю ваш вопрос, но может ли это быть тем, что вы ищете?
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>
{
};