C++ 标准类型扩展
C++ standard types extension
如果我想添加计算 absolutely/relatively 错误的功能,我该怎么办?我可以简单地实现 MyDouble class,它涵盖所有 double 功能并且可以执行此特定操作,然后 'replace' 使用此类型进行 double 吗?
(我想这样使用它:
写一些通常为double类型的代码
在我的文件开头添加一些头文件或写类似typedef double MyDouble
的内容
double值的估计误差,在我的代码中积累
删除我在第 2 点放入文件的内容
typedef 不足以拥有您自己的 class。如果您需要累积错误、重载某些操作或定义额外的成员,您当然需要一个成员来保存它们,并且还需要重载操作来定义错误传播规则。
这是一个开始:
class MyCDouble {
double d;
public:
MyCDouble(double x) : d(x) {}
operator double() const { return d; }
void analyze() {};
};
由于转换运算符和构造函数,您可以像使用双精度数一样使用 class。例如:
MyCDouble d = 3.14;
MyCDouble e = sqrt(d);
e.analyze();
cout << "sqrt of "<<d<<" is "<< e<<endl;
e = (d + 5)/3;
现在,由您来添加错误管理并重载所需内容。例如,您可以添加一个私有成员 double error;
,并重载传播错误的操作。例如,在 class 中,您可以添加:
MyCDouble operator+ (MyCDouble x) {
MyCDouble r = d+x;
r.error = max(r.error, x.error);
return r;
}
如果我想添加计算 absolutely/relatively 错误的功能,我该怎么办?我可以简单地实现 MyDouble class,它涵盖所有 double 功能并且可以执行此特定操作,然后 'replace' 使用此类型进行 double 吗?
(我想这样使用它:
写一些通常为double类型的代码
在我的文件开头添加一些头文件或写类似
typedef double MyDouble
的内容
double值的估计误差,在我的代码中积累
删除我在第 2 点放入文件的内容
typedef 不足以拥有您自己的 class。如果您需要累积错误、重载某些操作或定义额外的成员,您当然需要一个成员来保存它们,并且还需要重载操作来定义错误传播规则。
这是一个开始:
class MyCDouble {
double d;
public:
MyCDouble(double x) : d(x) {}
operator double() const { return d; }
void analyze() {};
};
由于转换运算符和构造函数,您可以像使用双精度数一样使用 class。例如:
MyCDouble d = 3.14;
MyCDouble e = sqrt(d);
e.analyze();
cout << "sqrt of "<<d<<" is "<< e<<endl;
e = (d + 5)/3;
现在,由您来添加错误管理并重载所需内容。例如,您可以添加一个私有成员 double error;
,并重载传播错误的操作。例如,在 class 中,您可以添加:
MyCDouble operator+ (MyCDouble x) {
MyCDouble r = d+x;
r.error = max(r.error, x.error);
return r;
}