为对象的成员提供别名

Give an alias to an object's member

本文关键字:别名 成员 对象      更新时间:2023-10-16

在C 中,是否可以为对象的成员分配一个别名(不同的名称(?

为例,假设我有一个x,CC_2,yzwvec4,分别为rgba。有什么办法可以做到这一点,而无需修改vec4的定义?

您将无法代替vec4_object.x而不修改vec4

如果您可以使用C 17,那么您可以做的一件事是使用结构化绑定,例如

vec4 pic = ...;
auto& [pic_r, pic_g, pic_b, pic_a] = pic;

然后您可以使用pic_rpic_gpic_bpic_a代替pic.xpic.ypic.zpic.w

如果您的vec4看起来像

struct vec4
{
    int x, y, z, w;
};

然后,这是从开箱即用的。如果没有,您仍然可以提供支持以允许。您可以在此博客文章

中查看如何完成此操作。

您不能使v.rv.x相同,除非您修改了类定义或编写#define r x,这显然会引起很多问题。您可以做的最接近的事情就是这样:

constexpr auto r = &vec4::x;
v.*r;  // equivalent to v.x
#include <iostream>
struct base {
    int a;
};
template<typename derived>
struct MemberIntRef {
    struct _ {
        operator int&() {
            auto p = reinterpret_cast<MemberIntRef*>(this);
            auto pd = static_cast<derived*>(p);
            return pd->a;
        }
        
        int& operator=(int a) {
            return operator int&() = a;
        }
    };
    [[no_unique_address]] _ b;
};
struct derived : public MemberIntRef<derived>, public base {
};
int main() {
    derived d;
    d.b = 1;
    std::cout << d.a << std::endl;
    d.a = 2;
    std::cout << d.b << std::endl;
}

您可以以这种方式编写代码。(但是我不确定是否是不确定的行为,有人可以提供帮助吗?(https://godbolt.org/z/dc9n7yfeh