我有一些特殊的数字类。该类可以用double构造:
struct FancyDouble{
FancyDouble& operator = (double v){
this->value = v;
return *this;
}
};
FancyDouble myFancyDouble = 5.0;
该类提供从double
到FancyDouble
的(隐式)转换。有没有办法做相反的事情?所以当我在数字表达式中使用FancyDouble
时,我想写一下:
double a = 123;
double b = b * myFancyDouble;
我查看了参考资料,我认为这是不可能的,但我不是很确定。
答案 0 :(得分:5)
是的,你可以。它们被称为转换运算符:
struct FancyDouble
{
// your things here
operator double() { return this->value; }
};
您可以转换为任何类型,而不仅仅是内置类型。它们通常也标记为const
(虽然我没有在此处显示核心概念)。
请注意,您的结构(如图所示)并不完全允许从double
到FancyDouble
的隐式转换;您的operator=
仅表示您可以在作业的右侧使用双精度,但如果您有一个FancyDouble
函数参数,则它将无效,因为您需要的是接受double的构造函数,而不是赋值运算符。
void foo(FancyDouble fd);
foo(4.4); // does not work because you can't construct a FancyDouble from a double
// even though you have an assignment operator
你会做这样的事情:
struct FancyDouble
{
// your things here
FancyDouble(double d) { /* initialization here */ }
};
有了这个,您只需要operator=
接受FancyDouble
而不是double
,转换将自动完成:
struct FancyDouble
{
// your things here
FancyDouble(double d) { /* initialization here */ }
FancyDouble& operator=(FancyDouble fd) { /* assignment here */ }
};
FancyDouble fd = 4.2; // works
fd = 5.5; // also works, because FancyDouble can be constructed implicitly from a double