c++小技巧(一)模版类不同具化类之间的转换
2017-11-02 23:19
225 查看
很多时候我们会写出下面这样的代码
上面的代码看起来很好,但是却编译不过。问题出在afloat=aint这句,你可能会说,我不要这句,不这么写就完了呗。但是实际问题中,一个int赋值给一个float是显而易见正确和有意义的,所以非常有可能我们恰恰就需要这样的代码,而且它在逻辑上也说得通,这就是模版类不同具现类之间转换。
不同类之间要实现转换,很简单写一个这样的类为参数的构造函数就可以了,但是对于模版,我们不可能这样做。我们应该写一个不同模版形参的模版类的构造函数就像这样:
ok啦!只要U能转换成T 那就可以A< U >转换成A< T >,以最开始的代码为例,当编译器遇到afloat=aint时,发现没有对应的赋值函数,但是有个A< float >=A< float >的赋值函数(编译器自动加的),所以编译器尝试把一个A< int >转变为A< float >,加上上面的代码,编译器发现可以完成这样的转换,就可以编译过了,这就是模版类不同具化间的转换。在编写模版类时,这是一个常用的技巧,stl中大量使用了它。
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/vc/c++不同数据类型之间的转换
- C++中不同数据类型之间的相互转换
- C++中不同类型数据之间的转换(调用库函数)
- C++不同类型字符串之间的相互转换
- C++中不同类型数据之间的转换(不调用库函数)
- C++中数字与字符串之间的转换
- C/C++开发语言系列之16---C++不同类型数据间的转换
- C++中string和int之间的转换
- 不同进制之间的转换
- 也谈C++中char*与wchar_t*之间的转换
- C++中数字与字符串之间的转换(使用CString.Format或者sprintf)
- C++中char*与wchar_t*之间的转换
- C++中数字与字符串之间的转换
- 实现在不同活动之间的转换(Intent的用法)
- 不同类型之间的转换
- C++实现字符串和整数之间的相互转换
- MFC/C++/C中字符类型CString, int, string, char*之间的转换
- Qt不同数据类型之间的转换
- c++中int double 与char,string之间的转换
- javascript不同类型数据之间的运算的转换方法