我有一个 Vector3 结构,由三个 double 类型的成员值组成。

struct Vector3 {
   double x, y, z;
};

我需要将此结构的实例的引用传递给接受 float 类型数组的函数。我无法更改它接受的类型。
void foo(const float *value);

我可以创建一个临时数组来更改类型并将其传递给函数:
Vector3 MyVector = Vector3(1, 2, 3);
const float temp[] = {(float)MyVector.x, (float)MyVector.y, (float)MyVector.z);
foo(temp);

虽然这有效,但我需要经常执行此操作,并且我想避免它造成的视觉困惑。

有没有一种好方法来定义一个函数来转换成员变量的类型并将其传递给 foo ?这是我尝试过的:
struct Vector3 {
  ...
  float* getPointer() {
     static float temp[3] = {x, y, z};
     return temp;
  }
}

struct Vector3 {
  ...
  float* getPointer() {
     std::vector<float> temp = {x, y, z};
     return temp.data();
  }
}

最佳答案

临时数组可以隐藏在 class 中:

class As_float_ptr {
public:
    As_float_ptr(const Vector3& vec)
        : data{(float)vec.x, (float)vec.y, (float)vec.z}
    { }

    operator const float*() { return data; }

private:
    const float data[3];
};

Vector3 vec;
foo(As_float_ptr{vec});

临时对象 As_float_ptr 只有在 foo() 返回后才会被销毁,因此将指向其数据成员 data[3] 的指针传递给 foo() 是安全的。

如果你想支持多种存储类型,你可以这样做:
template<std::size_t size>
class As_float_ptr {
public:
    As_float_ptr(const Vector2& vec) : data{(float)vec.x, (float)vec.y} {
        static_assert(size == 2);
    }

    As_float_ptr(const Vector3& vec) : data{(float)vec.x, (float)vec.y, (float)vec.z} {
        static_assert(size == 3);
    }

    operator const float*() { return data; }

private:
    const float data[size];
};

As_float_ptr(const Vector2&) -> As_float_ptr<2>;
As_float_ptr(const Vector3&) -> As_float_ptr<3>;

Vector2 vec2;
foo(As_float_ptr{vec2});

Vector3 vec3;
foo(As_float_ptr{vec3});

此代码使用 C++17 推导指南从构造函数参数的类型推导 size 模板参数。如果 C++17 不可用,则可以使用 make 类型函数代替:
As_float_ptr<2> make_float_ptr(const Vector2& vec) {
    return As_float_ptr<2>{vec};
}

As_float_ptr<3> make_float_ptr(const Vector3& vec) {
    return As_float_ptr<3>{vec};
}

foo(make_float_ptr(vec2));
foo(make_float_ptr(vec3));

关于c++ - 创建一个函数来转换数组元素的类型并返回数组的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58991645/

10-14 15:57
查看更多