gpt4 book ai didi

c++ - 创建一个函数来转换数组元素的类型并返回数组的地址

转载 作者:行者123 更新时间:2023-12-03 08:02:17 25 4
gpt4 key购买 nike

我有一个 Vector3 struct,由三个 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 -type 函数可以用来代替:
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com