为对象的成员提供别名
Give an alias to an object's member
在C 中,是否可以为对象的成员分配一个别名(不同的名称(?
为例,假设我有一个x
,CC_2,y
,z
和w
的vec4
,分别为r
,g
,b
和a
。有什么办法可以做到这一点,而无需修改vec4
的定义?
您将无法代替vec4_object.x
而不修改vec4
。
如果您可以使用C 17,那么您可以做的一件事是使用结构化绑定,例如
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;
};
然后,这是从开箱即用的。如果没有,您仍然可以提供支持以允许。您可以在此博客文章
您不能使v.r
与v.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
相关文章:
- 为类的成员创建别名
- 是否可以为模板类的模板函数成员设置别名?
- 将结构别名为其第一个成员是否严格违反别名
- 派生类中的成员字段别名(无访问器功能)
- 成员模板别名与另一个模板成员
- 使用使用成员类型别名的构造函数来推论类模板参数
- 为对象的成员提供别名
- 如何定义别名以通过结构访问枚举类成员
- 根据模板参数条件 C++17 创建成员别名
- 别名 私有子结构中的静态成员的定义
- 如何有效地将浮点数别名为数组的命名成员和元素
- 模板基类函数成员的别名
- 类模板专用化中的成员变量别名
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 我如何使用静态内类成员的别名
- C :方法中的字符串成员别名
- 如何制作特定类的成员函数或变量(如 STL 容器)的别名
- 我可以给派生类中基类的成员取别名吗
- C++:它是如何工作的别名成员类
- 在结构体中别名成员变量是否接受匿名联合?