// Args是一个模板参数包,args是一个函数形参参数包
// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
template <class ...Args>
void ShowList(Args... args)
{}
sizeof...(args)
void ShowList(Args... args)
{
cout << sizeof...(args) << endl;
}
分析:
void _ShowList()
{
// 结束条件的函数————传空
cout << endl;
}
template <class T, class ...Args>
void _ShowList(T val, Args... args)
{
cout << val << " ";
_ShowList(args...);
}
//args代表0-N的参数包
template <class ...Args>
void CppPrint(Args... args)
{
_ShowList(args...);
}
int main()
{
CppPrint();
CppPrint(1);
CppPrint(1, 2);
CppPrint(1, 2, 2.2);
CppPrint(1, 2, 2.2, string("xxxx"));
// ...
return 0;
}
template <class ...Args>
void ShowList(Args... args)
{
cout << sizeof...(args) << endl;
// 不支持这样打印
for (size_t i = 0; i < sizeof...(args); i++)
{
cout << args[i] << endl;
}
}
(printarg(args), 0)
,也是按照这个执行顺序,先执行PrintArg(args),再得到逗号表达式的结果0template <class T>
void PrintArg(T t)
{
cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowList(Args... args)
{
int arr[] = { (PrintArg(args), 0)... };
cout << endl;
}
int main()
{
ShowList(1);
ShowList(1, 'A');
ShowList(1, 'A', std::string("sort"));
return 0;
}
int a[] = { PrintArg(args)...};
void CppPrint()//单独讨论参数为空的清空
{
cout << endl;
}
template <class T>
int PrintArg(T t)
{
cout << t << " ";
return 0;
}
//args代表0-N的参数包
template <class ...Args>
void CppPrint(Args... args)
{
int a[] = { PrintArg(args)...};
cout << endl;
}
int main()
{
CppPrint();
CppPrint(1);
CppPrint(1, 2);
CppPrint(1, 2, 2.2);
CppPrint(1, 2, 2.2, string("xxxx"));
return 0;
}
class Date
{
public:
Date(int year = 1, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
cout << "Date构造" << endl;
}
Date(const Date& d)
:_year(d._year)
, _month(d._month)
, _day(d._day)
{
cout << "Date拷贝构造" << endl;
}
private:
int _year;
int _month;
int _day;
};
template <class ...Args>
Date* Create(Args... args)
{
Date* ret = new Date(args...);
return ret;
}
int main()
{
Date* p1 = Create();
Date* p2 = Create(2023);
Date* p3 = Create(2023, 9);
Date* p4 = Create(2023, 9, 27);//构造
Date d(2023, 1, 1);
Date* p5 = Create(d);//拷贝构造
return 0;
}