gpt4 book ai didi

c++ - 定义和调用类的转换运算符

转载 作者:行者123 更新时间:2023-11-28 07:56:44 25 4
gpt4 key购买 nike

我正在阅读这篇文章:

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);

它使用浮点参数实例化 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();

一方面,它提供了很好的灵 active ,因为无需编写额外的代码,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;
}

这是一个以 float 形式返回内部数据的函数。

文章中让您感到困惑的两行只是向您展示示例将生成哪些函数:

Convert<int>::operator<float> float();
Convert<int>::operator<double> double();

第一个是转换为 float 的operator float。第二个是转换为 double 的 operator double

关于c++ - 定义和调用类的转换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12552193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com