gpt4 book ai didi

c++ 数组元素的别名

转载 作者:可可西里 更新时间:2023-11-01 17:59:56 41 4
gpt4 key购买 nike

我有一个(列)Vector 类,它包含一个可以访问的值数组:

Vec<int, 4> v();
v[0] = -2; // <- set first value to -2
v[1] = 1; // <- set second value to 1
....

但这是我的问题:如何为 v[0]、v[1]、v[2]、v[3] 创建别名?。我想将前 4 个值定义为 v.x, v.y, v.z, v.w:

Vec<int, 4> v();
v.x = -2; // <- set first value to -2
v.y = 1; // <- set second value to 1
v.z = 4; // <- set third value to 4
v.w = 2; // <- set fourth value to 2

我应该能够分配读取值,我不希望它们看起来像一个函数,所以访问第一个值如下:

Vec<int, 4> v();
v.x() = -2; // <- set first value to -2

不好。最重要的是, vector 类是模板化的,x 应该只定义为 dimensions >= 1,而 y 只能定义为 dimenions >= 2 ...等等。 .. 我该如何实现?

编辑: Vector 类与 std::vector 无关,它是一个类似于数组的数学 vector ,因为它具有固定大小并且仅用于数学运算。 (将 Vector 重命名为 Vec)。

我尝试过的:

矩阵类:

template <typename T, size_t ROWS, size_t COLS>
class Matrix {

public:
T& operator[] (size_t idx) {return m_matrix[idx];}
T operator[] (size_t idx) const {return m_matrix[idx];}

private:
m_matrix[ROWS * COLS]
};

vector 类:

template <typename T, size_t N>
class Vec: public Matrix<T, 1, N>{

public:

T& x() {return (*this)[0];}
T x() const {return (*this)[0];}

T& y() {return (*this)[1];}
T y() const {return (*this)[1];}

T& z() {return (*this)[2];}
T z() const {return (*this)[2];}

T& w() {return (*this)[3];}
T w() const {return (*this)[3];}
};

这行得通,如果没有为这个维度定义函数,我可以很容易地使用 enable_if 删除函数,但这在语法上并不令人满意。我试过使用引用资料:

template <typename T, size_t N>
class Vec: public Matrix<T, N, 1>{

public:

T& x = (*this)[0];
T& y = (*this)[1];
T& z = (*this)[2];
T& w = (*this)[3];
};

但这不起作用,它不会给我一个错误,但它也没有正确设置值,当我在设置后访问它们时它们是未定义的。

编辑 nr 2: 可能只存在一个更简单的解决方案,当我最后一次尝试使用 Visual Studio 社区 2015 的默认编译器编译引用时,它就可以工作了。但是当我使用 GNU GCC 编译器在 Code::Blocks 中编译它时,它却没有。标准怎么说?我的解决方案是否允许使用引用,哪个编译器错误?

最佳答案

这个:

template <typename T, int D> struct Vec;

// You have to manually specialize for all needed sizes
template <typename T> struct Vec<T, 4>
{
T x, y, z, w;

T &operator[](int index)
{
switch (index)
{
default: // throw or something?
case 0: return x;
case 1: return y;
case 2: return z;
case 3: return w;
}
}
const T &operator[](int index) const
{
switch (index)
{
default: // throw or something?
case 0: return x;
case 1: return y;
case 2: return z;
case 3: return w;
}
}
};

switch索引不是最优的,但至少它是明确定义的。

对于矩阵我更喜欢使用 Vec<Vec<T, Height>, Width> ,这使得 mat[x][y]符号工作。 (如果需要,可以交换 xy。)

关于c++ 数组元素的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48080120/

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