Browse Source

保存函数模板和类模板

Yinqi Tong 2 months ago
parent
commit
6f0b3e9026
2 changed files with 92 additions and 0 deletions
  1. 54 0
      class_template.cpp
  2. 38 0
      function_template.cpp

+ 54 - 0
class_template.cpp

@@ -0,0 +1,54 @@
+#include<type_traits>
+#include<string>
+//类模板
+
+//一个最基本的类模板
+template<typename T1>
+class stack
+{
+
+};
+
+
+//类模板的特化,即设定当模板参数为某些类型的时候的操作
+//其中的每一个函数都将不是模板函数,即非泛型函数
+template<>
+class stack<int>
+{
+
+};
+
+
+
+
+template <typename T>                                   //别名模板
+using void_t = void;
+
+
+//偏特化
+template<typename T1, typename T2 = void>              //带默认参数的主模板
+struct check :public std::false_type {};
+
+template<typename T1>                   //注意这是原函数模板的偏特化,所以允许出现另一个参数
+struct check<T1, void_t<decltype(std::declval<T1>() / std::declval<T1>())>> :public std::true_type
+{
+};
+
+
+//类的模板推导
+//C++中要求能模板推导的类的默认构造函数是可用的
+//这样将能够使用类的类型推导
+template<typename T>
+class stack
+{
+	stack() = default;
+	stack(T) {}
+};
+
+
+//但是推导会出现新的问题
+template<typename T>
+class stack
+{
+	stack(const char*)->stack<std::string>;            //推导指引,当出现const char* 的时候推导为std::string
+};

+ 38 - 0
function_template.cpp

@@ -0,0 +1,38 @@
+#include<iostream>
+#include<string>
+template<typename T>
+void fun(T data=1)               //当有默认参数的时候默认参数本身不能模板类型推导
+{
+	std::cout << data << std::endl;
+}
+
+template <typename T1,typename T2, typename R1>
+R1 fun1(T1 a, T2 b)                          //这里R1需要显示指定,因为并没有能推导的地方
+{
+	return a + b;
+}
+
+template <typename T1, typename T2>
+auto fun2(T1 a, T2 b) -> decltype(a < b ? a : b)           //当然有的时候可能ab是引用会推导出引用
+{
+	return a < b ? a : b;
+}
+
+template <typename T1, typename T2>
+auto fun3(T1 a, T2 b) ->std::decay_t<decltype(a < b ? a : b)>           //当然有的时候可能ab是引用会推导出引用,外层剥离引用
+{
+	return a < b ? a : b;
+}
+
+
+
+
+int main()
+{
+	fun(1);
+	fun<int>();
+	std::cout << check<int>::value << std::endl;
+	std::cout << check<std::string>::value << std::endl;
+}
+
+