2016-12-27 67 views
2

假設我有一個模板類,我使用enum class作爲模板參數。這是一個完整的(簡單)例如:帶`enum類的冗餘語法'

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>語法的方法嗎?

+4

你可以用'typedef'定義更短的別名囉嗦類名,這幾乎是它。 –

回答

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 
} 
+1

不確定添加使用語句是否真的不那麼冗長,值得您的原始版本提供的簡單性的損失:) – Drax