我正在阅读这篇文章:
http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1
我不明白某些观点。好的。如何“转换”将自己转换为任何数据类型?下面行末的 float() 和 double() 是什么意思?转换如何发生?您能否详细解释一下?
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
对于那些想要文章相关部分的人,我将其复制粘贴在下面,与我的问题相关的部分在最后。
当然,带有方法模板的“显式模板参数规范”也是可能的。考虑另一个例子:
template<class T>
class Convert
{
T data;
public:
Convert(const T& tData = T()) : data(tData)
{ }
template<class C>
bool IsEqualTo( const C& other ) const
{
return data == other;
}
};
可以用作:
Convert<int> Data;
float Data2 = 1 ;
bool b = Data.IsEqualTo(Data2);
它使用 float 参数实例化 Convert::IsEqualTo。如下所示,显式规范将用 double 实例化它:
bool b = Data.IsEqualTo<double>(Data2);
令人震惊的事情之一是,在模板的帮助下,您可以通过在模板之上定义转换运算符来做到这一点!
template<class T>
operator T() const
{
return data;
}
只要有可能,就可以将 Convert' 类模板实例转换为任何类型。考虑以下使用示例:
Convert<int> IntData(40);
float FloatData;
double DoubleData;
FloatData = IntData;
DoubleData = IntData;
这将实例化以下两种方法(完全限定名称):
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
一方面,它提供了很好的灵活性,因为无需编写额外的代码,Convert 就可以将自身(特定的实例化)转换为任何数据类型——只要在编译级别可以进行转换。如果无法进行转换,例如从 double 类型转换为 string 类型,则会引发错误。