[英]defining and calling conversion operator of a class
我在阅读文章:
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即可将自身(特定的实例化)转换为任何数据类型。 如果无法进行转换(例如从双精度类型转换为字符串类型),则会引发错误。
类类型可以具有用户定义的转换 。 这使您可以将类的实例转换为另一种类型。 例如,这里有一个结构,当转换为int时始终具有值42:
struct A {
operator int() { return 42; }
};
这是一个特殊的函数,即operator int
,被调用以转换为int。 现在,如果我们有A的实例a
,我们可以轻松地将其转换为int:
A a;
int x = a; // x now has the value 42
在本文中,它们显示了如何使用模板为任何类型生成转换运算符。 功能模板定义为:
template<class T>
operator T() const
{
return data;
}
现在,每当您尝试将对象转换为另一种类型时,都会生成该函数的新版本,将T替换为要转换为的类型。 因此,如果我们进行float f = a
,将生成以下函数:
operator float() const
{
return data;
}
该函数以浮点数形式返回内部数据。
文章中的两行让您感到困惑,它们只是向您显示该示例将生成哪些函数:
Convert<int>::operator<float> float();
Convert<int>::operator<double> double();
第一个是operator float
,它转换为float。 第二个是operator double
,它转换为double。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.