首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有` `enum class`的冗余语法

带有` `enum class`的冗余语法
EN

Stack Overflow用户
提问于 2016-12-27 10:44:06
回答 1查看 65关注 0票数 2

假设我有一个模板化的类,其中我使用enum class作为模板参数。下面是一个完整的(微不足道的)示例:

代码语言:javascript
复制
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>语法?

EN

回答 1

Stack Overflow用户

发布于 2016-12-27 10:44:06

将类及其enum class放入一个名称空间,在该名称空间中,它们可以具有简短的名称:

代码语言:javascript
复制
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语句:

代码语言:javascript
复制
int main(){
  using Animal::Animal;
  using Animal::Type; // error
  Animal<Type::Dog> dog;
  Animal<Type::Cat> cat;
  … etc
}

如果类和名称空间具有相同的名称,则不能编写using Animal::Type;,因为它是不明确的。但是您可以使用全局作用域符号来显式地显示您正在使用的名称空间:

代码语言:javascript
复制
int main(){
  using ::Animal::Animal;
  using ::Animal::Type; // ok
  Animal<Type::Dog> dog; 
  … etc
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41338386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档