客户做网站一定报价怎么办,新服务器做网站,免费模板最多的视频制作软件,我想自己开发一个游戏目录 1.模板
1.1模板基本使用
1.2.模板实例化
1.3函数模板的匹配规则
2.类模板 !!!!!!!目前更新到这#xff0c;后面再更新模板的其他内容#xff0c;本文章只是第一部分#xff0c;第二部分等后面我再写!!!!
1模板
1.1模板基本使用 templatetypename T
void …目录 1.模板
1.1模板基本使用
1.2.模板实例化
1.3函数模板的匹配规则
2.类模板 !!!!!!!目前更新到这后面再更新模板的其他内容本文章只是第一部分第二部分等后面我再写!!!!
1模板
1.1模板基本使用 templatetypename T
void swap(T left, T right)
{T temp left;left right;right temp;
}int main()
{int a 2, b 3;double a1 2.1, b1 3.1;swap(a, b);swap(a1, b1);return 0;
}
auto不能用在函数参数上而void*也难以解决自定义类型所以c这里又出现了
个模板用来解决类似的问题。像上面我们将交换函数用这种方式写就可以让内置和自定义都能
放进去。
template是关键字typename可以用class替代但不能用struct替代
templatetypename T1,typename T2,typename T3,typename T4 注意T1,T2可以是一样的类型比如函数参数是T1 x,T2 y 。我们传可以都穿int最后T1和T2就都会是int类型。 像上面的例子每次调用不同类型本质上是调用了不同的函数编译器自身麻烦点每次都生成个函数来用但我们只管传就行。 1.2.模板实例化 templatetypename T
T swap(const T left, const T right)
{return leftright;
}int main()
{int a 2, b 3;double a1 2.1, b1 3.1;swap(a, a1);swap(b, b1);return 0;
}
这个情况模板参数只有一个T我们传两个不同类型的参数给函数
编译器无法确认T到底是什么类型这样就会报错。
我们可以通过给更多的模板参数函数的参数也用不同的模板参数还有就是在传参的时候做改变
T add( T left, T right)
{return left right;
}int main()
{int a 2, b 3;double a1 2.1, b1 3.1;int gadd(a, b);g add(a, (int)a1);cout g endl;return 0;
}
这时候可以用两种一个是强转像上面的一样。一种就是addint(a,a1);
也就是显示实例化
但这样还是会报错为什么呢因为函数参数我们用了引用但这样的话这两种方法本质上都是让传递的参数适应函数模板并且这两种方法都是产生了a1都是进行了类型转换转换后产生的临时变量再传参但是引用一般不支持临时变量的引用所以上面的方法必须还得对函数的参数进行改变如下
T add( const T left, const T right)//const加引用才支持临时变量
{return left right;
}int main()
{int a 2, b 3;double a1 2.1, b1 3.1;int gadd(a, b);g add(a, (int)a1);cout g endl;return 0;
}而显示实例化一般是针对模板函数的参数里面没有模板参数用上面的例子的话就是add函数的参数里面没有T类型而是用在了函数体里面。 1.3函数模板的匹配规则 int Add(double left, double right)
{return left right;
}
templateclass T
T Add(T left, T right)
{return left right;
}
void Test()
{Add(1, 2); // 与非模板函数匹配编译器不需要特化Adddouble(1, 2); // 调用编译器特化的Add版本
}
非模板函数与同名模板函数可以同时存在。Add(1, 2)这句调用第一个函数因为对于编译器来说会省下一个实例化模板的操作
但如果 Adddouble(1, 2);的话就会强制让编译器实例化模板函数。int Add(int left, int right)
{return left right;
}
templateclass T1, class T2
T1 Add(T1 left, T2 right)
{return left right;
}
int main()
{Add(1,2);这里会直接调用非模板函数Add因为类型完全匹配Add(1,2.0);//这里如果没有模板函数那么也是可以传参的只是会进行隐式类型转换。//但这里有函数模板那么编译器就会选择实例化函数模板产生一个更加匹配的函数来接收参数return 0;
}
注意!!
函数模板不支持自动类型转换普通函数支持2.类模板 关于类模板先看下面的代码 class aaa
{
public:aaa(){b 10;}
private:int b;
};int main()
{aaa* a new aaa;return 0;
}
这样这个类里面b是固定的int类型我们如果想让b存别的类型就得cv一下再写个别的类型的
但通过类模板比如
templatetypename T
class aaa
{
public:aaa(T b){_b b;}
private:T _b;
};int main()
{aaaint a;return 0;
}
通过实例化我们传什么类型就生成什么类型的类。
实例化之后的才是一个类上面那个是类模板 如果类模板里声明一个函数类模板外定义函数那么在类模板外定义的时候要先加个 templatetypename T(具体不一定这样但是重点是加模板参数列表)在函数定义的上面 templatetypename T
class aaa
{
public:aaa(T b);
private:T _b;
};template class T
aaaT::aaa(T b)
{//.....
} 声明和定义必须在同个文件。