繁体   English   中英

定义并调用类的转换运算符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM