class_template.cpp 1003 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include<type_traits>
  2. #include<string>
  3. //类模板
  4. //一个最基本的类模板
  5. template<typename T1>
  6. class stack
  7. {
  8. };
  9. //类模板的特化,即设定当模板参数为某些类型的时候的操作
  10. //其中的每一个函数都将不是模板函数,即非泛型函数
  11. template<>
  12. class stack<int>
  13. {
  14. };
  15. template <typename T> //别名模板
  16. using void_t = void;
  17. //偏特化
  18. template<typename T1, typename T2 = void> //带默认参数的主模板
  19. struct check :public std::false_type {};
  20. template<typename T1> //注意这是原函数模板的偏特化,所以允许出现另一个参数
  21. struct check<T1, void_t<decltype(std::declval<T1>() / std::declval<T1>())>> :public std::true_type
  22. {
  23. };
  24. //类的模板推导
  25. //C++中要求能模板推导的类的默认构造函数是可用的
  26. //这样将能够使用类的类型推导
  27. template<typename T>
  28. class stack
  29. {
  30. stack() = default;
  31. stack(T) {}
  32. };
  33. //但是推导会出现新的问题
  34. template<typename T>
  35. class stack
  36. {
  37. stack(const char*)->stack<std::string>; //推导指引,当出现const char* 的时候推导为std::string
  38. };