c++中同一变量的多个名称
Multiple names for the same variable in C++
是否有可能在c++中使用不同的名称而不使用预处理器来引用相同的变量?
要达到与伪代码
相同的效果struct vec3f {
float[3] values;
};
struct color : public vec3f {
#define r values[0]
#define g values[1]
#define b values[2]
};
color c;
c.r = 0.5f;
除了在结构体中为3个引用分配空间之外,以下语句具有正确的语义:
struct color : public vec3f {
float& r;
float& g;
float& b;
color() : r(values[0]), g(values[1]), b(values[2]) { }
};
是否有一种方法可以在不增加结构体大小的情况下获得此编译时名称替换?
这个怎么样?
struct vec3f {
float[3] values;
};
struct color : public vec3f
{
float& r() { return values[0]; }
float& g() { return values[1]; }
float& b() { return values[2]; }
const float& r() const { return values[0]; }
const float& g() const { return values[1]; }
const float& b() const { return values[2]; }
};
我不确定您是否想在这种情况下使用继承。您最好使用普通的旧式union
类型:
typedef float vec3f[3];
union color {
vec3f values;
struct {
float r;
float g;
float b;
};
};
color c;
c.values[0] = 10;
assert( c.r == 10 );
碰巧的是,我在几年前第一次看到一个非常巧妙的技巧。
的想法是,你给类命名的变量顺序,然后也有一个static const
成员的指针到成员类型的数组。operator[]
被重载以查找合适的成员指针,使用它从this
中选择成员,并返回一个引用。
之所以有效,是因为指向成员的指针不是普通指针;它们比这更神奇。(这就是为什么您可以创建指向成员函数的非绑定指针,以及为什么它们不能用于期望使用普通函数指针的地方)。
这也意味着你不必使用任何类型的转换技巧,依赖于任何类型的对齐、不可移植的匿名联合行为或内存布局保证,并且你仍然可以将结构的组件引用为命名字段,而不是通过访问器函数。
替代1
当你想要一个变量别名时,你总是创建一个临时变量。使用一个好的优化器,您几乎看不到任何性能差异。
struct vec3f
{
float values[3];
};
struct tempvec
{
float &r;
float &g;
float &b;
tempvec( vec3f& bar )
:r(bar.values[0])
, g(bar.values[1])
, b(bar.values[2]){}
};
int main()
{
vec3f temp;
temp.values[0] = 2.40f;
//when you want to alias values[0] as r do this
tempvec(temp).r = 42;
tempvec(temp).g = 42;
return 0;
}
替代2 如果您可以验证vec3f
和vec3c
的内存布局在您的平台和操作系统上是相同的…考虑到填充/对齐等…你可以做
struct vec3f
{
float values[3];
};
struct vec3c
{
float r,g,b;
};
int main()
{
vec3f temp;
temp.values[0] = 2.40f;
vec3c* alias = reinterpret_cast<vec3c*>(&temp);
alias->r = 4.2f;
alias->g = 4.2f;
alias->b = 4.2f;
return 0;
}
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 执行函数时导致崩溃的变量
- 变量没有改变?通过向量的函数调用