【发布时间】:2014-10-21 22:29:57
【问题描述】:
您将如何在标准 C++11/14 中执行此操作?因为如果我没记错的话,这不是具有匿名结构的标准兼容代码。
我希望以与您相同的方式访问成员。
template <typename some_type>
struct vec
{
union {
struct { some_type x, y, z; };
struct { some_type r, g, b; };
some_type elements[3];
};
};
【问题讨论】:
-
如果你坚持能写
vec<int> t; t.x = 10;那么你可以给它引用成员x、y、z等,并初始化它们引用@的对应成员987654326@,但这会大大增加结构的大小。如果你能容忍t.x() = 10,那就让它们成为成员函数。 -
但我认为
vec.x = 42; assert(vec.r == 42);无论如何都不是标准的保证(但编译器可能)。 -
@Jarod42 N3936 [class.mem]/18:“如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,并且如果标准布局联合对象当前包含这些标准布局结构之一,允许检查其中任何一个的公共初始部分。..."
-
为了像使用非标准匿名结构一样访问成员,请为您的结构命名,就像 Praetorian 告诉您的那样,并在您的模板类型中为匿名结构的每个成员定义一个引用:
struct vec{ ..... some_type &x=a.x; ...};你可以参考vx而不是vax