定义和调用类的转换运算符
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可以将自己(特定的实例化)转换为任何数据类型——只要在编译级别可以进行转换。如果无法进行转换,例如从double类型转换为字符串类型,则会引发错误。
类类型可以有用户定义的转换。这允许您将类的实例转换为另一种类型。例如,这里有一个结构,当转换为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
,它转换为双精度。
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?