给一个对象的成员一个别名
Give an alias to an object's member
在 C++ 中,是否可以为对象的成员分配别名(不同的名称)?
举个例子,假设我有一个 vec4
,其中包含我要引用的成员 x
、y
、z
和 w
分别为 r
、g
、b
和 a
。有没有办法在不修改 vec4
?
的定义的情况下做到这一点
你不能使 v.r
与 v.x
相同,除非你修改 class 定义或编写 #define r x
,这显然会导致很多问题。您可以做的最接近的事情是这样的:
constexpr auto r = &vec4::x;
v.*r; // equivalent to v.x
如果不修改 vec4
,您将无法用 vec4_object.r
代替 vec4_object.x
。
如果你可以使用 C++17,那么你可以做的一件事就是使用 structured binding 比如
vec4 pic = ...;
auto& [pic_r, pic_g, pic_b, pic_a] = pic;
然后您可以使用 pic_r
、pic_g
、pic_b
和 pic_a
代替 pic.x
、pic.y
、pic.z
和 pic.w
如果你的vec4
看起来像
struct vec4
{
int x, y, z, w;
};
那么这就是开箱即用的。如果不是,您仍然可以提供支持以允许这样做。您可以在 this blog post
中看到这是如何完成的
在 C++ 中,是否可以为对象的成员分配别名(不同的名称)?
举个例子,假设我有一个 vec4
,其中包含我要引用的成员 x
、y
、z
和 w
分别为 r
、g
、b
和 a
。有没有办法在不修改 vec4
?
你不能使 v.r
与 v.x
相同,除非你修改 class 定义或编写 #define r x
,这显然会导致很多问题。您可以做的最接近的事情是这样的:
constexpr auto r = &vec4::x;
v.*r; // equivalent to v.x
如果不修改 vec4
,您将无法用 vec4_object.r
代替 vec4_object.x
。
如果你可以使用 C++17,那么你可以做的一件事就是使用 structured binding 比如
vec4 pic = ...;
auto& [pic_r, pic_g, pic_b, pic_a] = pic;
然后您可以使用 pic_r
、pic_g
、pic_b
和 pic_a
代替 pic.x
、pic.y
、pic.z
和 pic.w
如果你的vec4
看起来像
struct vec4
{
int x, y, z, w;
};
那么这就是开箱即用的。如果不是,您仍然可以提供支持以允许这样做。您可以在 this blog post
中看到这是如何完成的