您的位置:首页 > 编程语言 > C语言/C++

c++小技巧(一)模版类不同具化类之间的转换

2017-11-02 23:19 225 查看
很多时候我们会写出下面这样的代码

template <typename T>
class A
{
public:
A(T _a):m_a(_a){}
void print()
{
cout<<m_a<<endl;
}
T m_a;
};
int main()
{
A<int> aint(20);
A<float> afloat(50);
afloat=aint;
return 0;
}


  上面的代码看起来很好,但是却编译不过。问题出在afloat=aint这句,你可能会说,我不要这句,不这么写就完了呗。但是实际问题中,一个int赋值给一个float是显而易见正确和有意义的,所以非常有可能我们恰恰就需要这样的代码,而且它在逻辑上也说得通,这就是模版类不同具现类之间转换。

  不同类之间要实现转换,很简单写一个这样的类为参数的构造函数就可以了,但是对于模版,我们不可能这样做。我们应该写一个不同模版形参的模版类的构造函数就像这样:

template <typename T>
class A
{
public:
explicit A(T _a):m_a(_a){}
//就像这样!!!!!!
template<typename U>
A(A<U>& _a):m_a(_a.m_a){}
void print()
{
cout<<m_a<<endl;
}
T m_a;
};


  ok啦!只要U能转换成T 那就可以A< U >转换成A< T >,以最开始的代码为例,当编译器遇到afloat=aint时,发现没有对应的赋值函数,但是有个A< float >=A< float >的赋值函数(编译器自动加的),所以编译器尝试把一个A< int >转变为A< float >,加上上面的代码,编译器发现可以完成这样的转换,就可以编译过了,这就是模版类不同具化间的转换。在编写模版类时,这是一个常用的技巧,stl中大量使用了它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 构造函数