template学习之零值初始化及字符串常量作(function template argument)函数模版参数问题



本篇只是摘抄自《c++ template》小问题比较少注意,而且也容易忘记
1 零值初始化
对于基本的数据类型int,double,pointer type来说,一般没有default构造式对其初始化,比如下面的代码
void foo(){
int x; //x的值不定
int *ptr; //ptr的指向也不定
}
如果在template中使用这样的代码,如下
template <typename T>
void foo(){
T x;
}
如果上面的的T是基本数据类型时,x的值就没有初始化,所以这样的方法是不能保证值一定被初始化的,我们知道有些时候变量没有初始化可能对导致程序一些意想不到的问题,为了解决这样的问题,我可以在宣告内建型别时显示调用default构造式,像下面这样的情况
template <typename T>
void foo(){
T x = T();//如果T是内建型别,比如int,double等,x也会初始化为0
}
在class template的成员中,也可能出现这样的情况。所以一般需要使用类的参数初始化列表如下:
template <typename T>
class MyClass{
private:
T x;
public:
MyClass(): x(){ //这样也可以确保,即使T是基本类型,也能对x进行初始化
}
};


2 以字符串常量作为Function Template Argument 
比如下面的代码:
#include <string>


template <typename T>
inline T const &max (T const & a,T const &b){
return a > b ? a:b;
}


int main(){
std::string s;
::max("apple","peach"); // Ok,型别相同
::max("apple","tomato"); //Error,型别不同
::max("apple",s); //Error,型别不同
}
问题在于字符串字面常数的长度不同,因而其底层的Array型别也不同,具体的为"apple"和“peach”的型别都为char const [6],而“”tomato“的型别为char const[7],所以会有问题,当使用by value的传值形式时,可以解决一点问题,但是也会引起不必要的拷贝。具体如下:
template <typename T>
inline T max(T a ,T b){
return a > b ? a:b;
}


则上面的第一个和第二个正确,第三个仍然错误,先记住这些,具体解决办法请参考《c++ Template》

模板参数推导(template argument deduction)是C++11中引入的一个新特性,它可以自动推导模板参数,避免手动指定模板参数。 在使用模板函数模板类时,通常需要手动指定模板参数,例如: ``` template<typename T> void foo(T t); int main() { foo<int>(1); // 指定模板参数为int return 0; } ``` 在上面的代码中,我们调用了模板函数`foo`,并手动指定了模板参数为int。这种方式比较繁琐,容易出错。 模板参数推导可以自动推导模板参数,避免手动指定模板参数。例如: ``` template<typename T> void foo(T t); int main() { foo(1); // 自动推导模板参数为int return 0; } ``` 在上面的代码中,我们调用了模板函数`foo`,并没有手动指定模板参数,编译器会自动推导模板参数为int。 模板参数推导可以用于函数模板和类模板的实例化过程中。它可以根据函数参数或对象成员的类型,自动推导出模板参数的类型。例如: ``` template<typename T, int N> class Array { public: T data[N]; }; int main() { Array arr{1, 2, 3}; // 自动推导模板参数为int和3 return 0; } ``` 在上面的代码中,我们定义了一个类模板`Array`,它有两个模板参数,一个是类型参数T,一个是整型参数N。在实例化`Array`对象时,我们只传入了一个参数{1, 2, 3},编译器会自动推导模板参数为int和3。 需要注意的是,模板参数推导只能用于函数模板和类模板的实例化过程中,不能用于模板定义中。在模板定义中,必须手动指定模板参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值