C++ 带有`enum类的冗余语法`

C++ 带有`enum类的冗余语法`,c++,c++11,C++,C++11,假设我有一个模板类,其中我使用enum类作为模板参数。下面是一个完整(微不足道)的示例: enum类动物类型{狗、猫、仓鼠}; 模板 类动物{ 公众: std::string speak(); }; 模板 std::string Animal::speak(){ 返回“纬”; } 模板 std::string Animal::speak(){ 返回“喵喵”; } 模板 std::string Animal::speak(){ 返回“Iä!Iä!Cthulhu fhtagn!”; } int ma

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

enum类动物类型{狗、猫、仓鼠};
模板
类动物{
公众:
std::string speak();
};
模板
std::string Animal::speak(){
返回“纬”;
}
模板
std::string Animal::speak(){
返回“喵喵”;
}
模板
std::string Animal::speak(){
返回“Iä!Iä!Cthulhu fhtagn!”;
}
int main(){
动物犬;
动物猫;
动物仓鼠;

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

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
如果类和命名空间具有相同的名称,则不能使用Animal::Type;
编写
,因为这是不明确的。但可以使用全局范围符号明确表示您正在使用命名空间:

int main(){
  using ::Animal::Animal;
  using ::Animal::Type; // ok
  Animal<Type::Dog> dog; 
  … etc
}
intmain(){
使用::动物::动物;
使用::Animal::Type;//确定
动物犬;
…等等
}

您可以使用
typedef
为冗长的类名定义较短的别名,差不多就是这样。不确定添加的using语句是否真的不那么冗长,是否值得失去原始版本提供的简单性:)
int main(){
  using Animal::Animal;
  using Animal::Type; // error
  Animal<Type::Dog> dog;
  Animal<Type::Cat> cat;
  … etc
}
int main(){
  using ::Animal::Animal;
  using ::Animal::Type; // ok
  Animal<Type::Dog> dog; 
  … etc
}