1、 Template 高级属性
1.1 可变参数
// CTemplatetest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include<Array>
#include<cstdarg> // C中是<stdarg.h>
#include <initializer_list>
#include <string.h>
using namespace std;
//***************************************偏特化***********************************************
template<typename T>
class A
{
public:
A(T para)
{
cout << "特化: " << para * para << endl;
}
};
template<>
class A<double>
{
public:
A(double para)
{
cout << "偏特化: " << para * para << endl;
}
};
template<typename T>
class A<T*>
{
public:
A(T para)
{
cout << "指针偏特化T*_T:" << para * para << endl;
}
A(T* para)
{
cout << "指针偏特化T*_T*:" << (*para) * (*para) << endl;
}
};
//***************************************模板可变参数***********************************************
//属性1: 可变参数
//功能说明: 当模板参数不定时,可以使用这个属性,当然需要有退出口
int TestPrintf(){ return 0; }
template<typename T>
int TestPrintf(T vag)
{
cout << "cur_vag: " << vag << endl;
return 1;
}
template< typename T, typename...Args>
int TestPrintf(T To, Args...ag)
{
int temp = 0;
TestPrintf(To);
temp +=TestPrintf(ag...);
return temp;
}
//***************************************非模板可变参数***********************************************
// va_list是一种数据类型,args用于持有可变参数。
// 定义typedef char* va_list;
//va_list args;
// 调用va_start并传入两个参数:第一个参数为va_list类型的变量
// 第二个参数为"..."前最后一个参数名
// 将args初始化为指向第一个参数(可变参数列表)
//va_start(args, paramN);
// 检索参数,va_arg的第一个参数是va_list变量,第二个参数指定返回值的类型
// 每一次调用va_arg会获取当前的参数,并自动更新指向下一个可变参数。
//va_arg(args, type);
// 释放va_list变量
//va_end(args);
int printftest(int num, ...)
{
int rusult = 0;
va_list args;
va_start(args, num);
for (int i = 0; i < num; i++)
{
cout << va_arg(args, int) << endl;
}
va_end(args);
return rusult;
}
//***************************************非模板可变参数C++11***********************************************
//如果函数的实参数量未知但是全部实参的类型都相同,我们可以使用initializer_list类型的形参(C++11新标准) 类似vector
string func(initializer_list<string> strlist)
{
string str = "";
for (auto data : strlist)
{
cout << "data: " << data.c_str() << endl;
str += data;
}
return str;
}
//**************************************template元编程**********************************
// 对于模板元编程: 你所要的计算,在编译的时候,已经处理玩了,只需要在运行的时候输出结果即可!
// 当硬件条件限制的情况下,除了优化算法,还有一种途径,那就是用模板元编程
/*
斐波那契数列
6 H(1)=H(0)=1;
7 H(N)= H(N-1)+H(N-2);
*/
template<int N>
struct data
{
enum{ value = data<N - 1>::value + data<N - 2>::value };
};
template<>
struct data<0>
{
enum{ value = 1 };
};
template<>
struct data<1>
{
enum{ value = 1 };
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "****************偏特化测试*******************" << endl;
A<int> a1(99);
A<double> a2(9.9);
int* pdata = new int;
*pdata = 199;
A<int*> a3(199);
A<int*> a4(pdata);
cout <<endl << "****************可变参数测试*****************" << endl;
TestPrintf(0, 1, 2, 3, 4);
cout << endl << "****************非模板可变参数*****************" << endl;
printftest(4, 1, 2, 3, 22);
cout << func({ "This", " ", "is", " ", "C++" }).c_str() << endl;
cout << endl << "****************元对象编程*****************" << endl;
cout << "元对象:" << data<5>::value << endl;
getchar();
return 0;
}