//编译期间, 生成对应的Sub<int>和Sub<double> (eg)
template <class T>
T Sub(T tv1, T tv2)
{
return tv1 + tv2;
}
template <typename T, typename U>
//auto Add(T tv1, U tv2) //auto用于表达推导返回值类型的含义。
auto Add(T tv1, U tv2) -> decltype(tv1 + tv2) //返回类型后置语法,这里的auto只是返回类型后
//置语法的组成部分,并没有类型推导的含义
{
return tv1 + tv2;
}
//偏特化分为两种 数量上, 范围类型上
//模版函数中没有模版函数偏特化(数量上的编译报错, 范围上的是重载不是特化), 有模版泛化, 全特化, 重载
//模版函数调用优先级:普通函数, 特化, 泛化
//重载
template <class T>
void test(T tv1)
{
std::cout<<tv1<<std::endl;
}
template <class T>
void test(T* tv1)
{
std::cout<<tv1<<std::endl;
}
////////////////////////////////////////////
//特化
template <typename T, typename U> //泛化
void test(T t, U u)
{
}
template <> //全特化
void test(int t, double u)
{
}
template <typename T, typename U>
void test(const T t, U u)//这是一个重载范围
{
}
template <typename U> //数量上特化, 编译报错
void test<int, U>(int t, U u)
{
}
template <typename U> //数量上特化重载(注意这个与上的区别)
void test(int t, U u)
{
}
/////////////////////////////////////////////
//缺省参数
template <typename T, typename U, auto n = 100>
void test(const T t, U u)
{
}