2020.11.27 第15课 C++新标准模板篇
01_初始列表initializer_list
#include <iostream>
#include <vector>
#include <initializer_list>
using namespace std;
template <class T>
class MM
{
public:
MM(initializer_list<T> x) :v(x)
{
cout << "初始化列表的构造函数" << endl;
}
void append(initializer_list<T> x)
{
v.insert(v.end(), x.begin(), x.end());
}
vector<T> getV()
{
return v;
}
protected:
vector<T> v;
};
template <class T>
void print(T data)
{
for (auto v : data)
{
cout << v << "\t";
}
cout << endl;
}
int main()
{
for (auto m : { 1,2,3,4,5,6 })
{
cout << m << "\t";
}
cout << endl;
vector<int> vec = { 1,2,3,4 };
for (auto m : vec)
{
cout << m << "\t";
}
cout << endl;
vector<int> vecInt = { 1,2,3,4,5,6,7,8,9,10 };
MM<int> mm{ 1,2,3,4,5,6 };
MM<int> mm1{ 1,2,3 };
MM<int> mm2{ 1,2 };
mm.append({ 5,6,7,8,9 });
for (auto v : mm.getV())
{
cout << v << "\t";
}
cout << endl;
print<initializer_list<int>>({ 1,2,3,5 });
print<initializer_list<int>>({ 1,3,4 });
return 0;
}
02_可变模板参数
#include <iostream>
#include <string>
using namespace std;
template<class ...Type>
void print(Type ...data)
{
cout << sizeof...(data) << endl;
}
int main()
{
print<>();
print<int>(1);
print<int, string, string>(1, "string", "ILoveyou");
print<int, string, string, double>(1, "string", "ILoveyou", 2.4);
print<int, string, string, double, string>(1, "string", "Iloveyou", 2.4, "Love");
return 0;
}
03_递归展开参数包
#include <iostream>
#include <string>
using namespace std;
void print()
{
cout << endl;
}
template <class T,class...Type>
void print(T data, Type...exData)
{
cout << data << "\t";
print(exData...);
}
template <class Type>
Type sum(Type t)
{
return t;
}
template <class T,class...Type>
T sum(T a, Type...b)
{
return a + sum<T>(b...);
}
int main()
{
print(1, 2, 3, 4);
print(1, "Loveyou", "Imissyou");
print(1);
cout << sum(1, 2) << endl;
cout << sum(1, 2, 4) << endl;
cout << sum(1, 3, 4, 5.5) << endl;
return 0;
}
04_逗号表达式解包过程
#include <iostream>
#include <string>
using namespace std;
template <class Type>
void print(Type data)
{
cout << data << "\t";
}
template<class ...Type>
void print(Type...data)
{
int array[] = { (print(data),0)... };
}
int main()
{
print(1, 2, 3);
cout << endl;
print("张三", "丹心", 133);
return 0;
}
05_元组的一些东西
#include <tuple>
#include <iostream>
using namespace std;
int main()
{
tuple<int> tp1 = make_tuple(1);
tuple<int, double> tp2 = make_tuple(1, 2.4);
tuple<int, double, string> tp3 = make_tuple(1, 2.4, "string");
cout << get<0>(tp3) << endl;
cout << get<1>(tp3) << endl;
cout << get<2>(tp3) << endl;
return 0;
}
06_可变模板类
#include <iostream>
using namespace std;
template <class...args>
struct Sum;
template <class First,class...args>
struct Sum<First, args...>
{
enum { value = Sum<First>::value + Sum<args...>::value };
};
template<class Type>
struct Sum<Type>
{
enum{value=sizeof(Type) };
};
int main()
{
cout << Sum<int, double, short, char>::value << endl;
return 0;
}
07_可变模板函数消除重复代码
#include <iostream>
using namespace std;
template<class T,class...Type>
T* Instance(Type...args)
{
return new T(args...);
}
class A
{
public:
A(int a){}
A(int a,int b){}
A(int a,int b,int c){}
A(int a,int b,string c){}
void print()
{
cout << "A中函数" << endl;
}
protected:
};
class B
{
public:
B(int a){}
B(int a,int b){}
B(int a,int b,int c){}
void print()
{
cout << "B中函数" << endl;
}
protected:
};
int main()
{
A* pA = Instance<A>(1, 2);
pA->print();
B* pB = Instance<B>(1, 3);
pA = Instance<A>(1, 3, "Loveyou");
pB = Instance<B>(1, 2, 3);
return 0;
}