我正在阅读文章:
http://www.codeproject.com/Articles/257589/An-Idiots-Guide-to-Cplusplus-Templates-Part-1
我不明白一点。 OKAY。如何“转换”将自身转换为任何数据类型? 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();
一方面,它提供了良好的灵活性,因为无需编写额外的代码,转换可以将自身(特定实例化)转换为任何数据类型 - 只要在编译级别进行转换。如果无法进行转换,例如从double到string-type,则会引发错误。
答案 0 :(得分:1)
类类型可以包含用户定义的转换。这允许您将类的实例转换为另一种类型。例如,这里我们有一个结构,转换为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
。第二个是operator double
,转换为双倍。