使用`enum class`的冗余语法

时间:2016-12-27 02:44:06

标签: c++ c++11

假设我有一个模板化的类,我使用enum class作为模板参数。这是一个完整的(琐碎的)例子:

enum class AnimalType { Dog, Cat, Hamster };

template <AnimalType>
class Animal {
public:
  std::string speak();
};

template <>
std::string Animal<AnimalType::Dog>::speak() {
  return "Woof";
}

template <>
std::string Animal<AnimalType::Cat>::speak() {
  return "Meow";
}

template <>
std::string Animal<AnimalType::Hamster>::speak() {
  return "Iä! Iä! Cthulhu fhtagn!";
}

int main() {
  Animal<AnimalType::Dog> dog;
  Animal<AnimalType::Cat> cat;
  Animal<AnimalType::Hamster> hamster;

  cout << dog.speak() << endl << cat.speak() << endl << hamster.speak() << endl;
}

有没有办法避免冗长和冗余的Animal<AnimalType::Hamster>语法?

1 个答案:

答案 0 :(得分:1)

将类及其enum class放入名称空间中,可以使用简短的名称:

namespace Animal {

enum class Type { Dog, Cat, Hamster };

template <Type>
class Animal {
public:
  std::string speak();
};

template <>
std::string Animal<Type::Dog>::speak() {
  return "Woof";
}

… etc

} // namespace Animal

然后在较窄的范围内使用using声明:

int main(){
  using Animal::Animal;
  using Animal::Type; // error
  Animal<Type::Dog> dog;
  Animal<Type::Cat> cat;
  … etc
}

如果类和命名空间具有相同的名称,则无法编写using Animal::Type;,因为它不明确。但您可以使用全局范围符号明确显示您正在使用命名空间:

int main(){
  using ::Animal::Animal;
  using ::Animal::Type; // ok
  Animal<Type::Dog> dog; 
  … etc
}