隐式指针转换为POD指针

Implicit pointer conversions to POD pointer

本文关键字:指针 POD 转换      更新时间:2023-10-16

我有很多具有此类签名的功能:

//libraries I can't change
void f1(double *x);
void f2(double *x1, double *x2);
...

和许多使用它们的代码:

//my code
double x; ... f1(&x);
double x1[] = ...; double x2 = ...; f2(x1, &x2);
...

由于某些原因,我决定在代码特殊类中而不是普通双打使用:

struct DoubleClass {
    double x_;
    ...
    //constructors, overloaded arithmetic operators and casts to double
};

这个双镜的行为就像是双重的,我想要一些其他功能。在存储器中,双层类与double相同。它只有1个成员和sizeof(doubleclass)== sizeof(double)。因此,我想用

之类的东西重新列出所有兼而有权
#define double DoubleClass

但我无法编译代码,因为DoubleClass*没有转换为double*。我无法更改功能F1,F2。所以我想问一下我是否可以以某种方式定义Doubleclass*的隐式转换为double*,或者也许有一些技巧可以做到。

f1()的情况下,以及f2()的第二个参数,您可以覆盖operator&以返回double*

struct DoubleClass {
    double x_;
    ...
    double* operator&() { return &x_; }
};

DoubleClass x = ...;
f1(&x);

DoubleClass x2 = ...;
f2(..., &x2);

但是,DoubleClass中没有运算符过载可以帮助您使用f2()的第一个参数,因为DoubleClass[]数组与double[]数组完全不同。需要明确的类型铸造:

DoubleClass x1[] = ...;
f2(reinterpret_cast<double*>(&x1[0]), ...);

否则将包装器与转换操作员使用:

template <const int N>
struct DoubleClassArray
{
    DoubleClass arr_[N];
    ...
    operator double*() { return arr_; }
};

DoubleClassArray<...> x = ...;
f2(x1, ...);

,所以我想用

之类的代码中的所有双打重新列出。
#define double DoubleClass

我不建议这样做。但是,如果这样做,则必须确保保护DoubleClass内部的double,否则它也会更改。定义超载将更安全:

struct DoubleClass {
    double x_;
    ...
    //DO NOT override operator&!
};
void f1(DoubleClass *x) { f1(reinterpret_cast<double*>(x); }
void f2(DoubleClass *x1, DoubleClass *x2) { f2(reinterpret_cast<double*>(x1), reinterpret_cast<double*>(x2); }
...

DoubleClass x; ...
f1(&x);

DoubleClass x1[] = ...;
DoubleClass x2 = ...;
f2(x1, &x2);

您能否通过扣除普通双重值而不是超载运算符检查?如果减去两个双打为0,则它们完全相等*

机器精密浮点示例,机器精度是一种挑剔的东西*