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

来源:互联网 发布:nat123访问数据库很慢 编辑:程序博客网 时间:2024/05/24 02:21

很多时候我们会写出下面这样的代码

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中大量使用了它。

原创粉丝点击