隐式指针转换为POD指针
Implicit pointer conversions to POD pointer
我有很多具有此类签名的功能:
//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,则它们完全相等*
机器精密浮点示例,机器精度是一种挑剔的东西*
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 使用指针算术通过均匀的POD结构
- 使用 Python、C++ 和 pybind11 返回并传递原始 POD 指针(数组)
- 隐式指针转换为POD指针
- 通过指向其基的指针删除 POD 对象是否安全
- 如果 Derived 没有向 Base 添加新成员(并且是 POD),则可以安全地完成哪种指针强制转换和取消引用