这是不可能的。但是有一个非常接近您想要实现的解决方法。它涉及将嵌套成员与“布局兼容”匿名结构一起放入联合中。缺点是接口有点臃肿,并且需要保持兄弟结构的定义同步。
struct Color {
float Red;
float Green;
float Blue; };
struct Material {
float Brightness;
union {
struct { // "Layout-compatible" with 'Color' (see citation below)
float DiffuseColorRed;
float DiffuseColorGreen;
float DiffuseColorBlue; };
Color DiffuseColor; }; };
int main() {
Material M;
float Material::* ParamToAnimate;
ParamToAnimate = &Material::DiffuseColorRed;
std::cin >> M.*ParamToAnimate;
std::cout << M.DiffuseColor.Red << std::endl;
return 0; }
ISO IEC 14882-2003 (c++03):
§3.9
11
如果两个类型 T1 和 T2 是同一类型,则 T1 和 T2 是布局兼容类型。[注意:布局兼容的枚举在 7.2 中描述。布局兼容的 POD 结构和 POD 联合在 9.2 中描述。]
§9.2
16
如果一个 POD-union 包含两个或多个 POD-structs,它们共享一个共同的初始序列,并且如果 POD-union 对象当前包含这些 POD-structs 之一,则允许检查其中任何一个的共同初始部分。如果对应的成员具有一个或多个初始成员序列的布局兼容类型(并且对于位域,具有相同的宽度),则两个 POD 结构共享一个公共初始序列。
多重嵌套也是可能的:
struct Color {
float Red;
float Green;
float Blue; };
struct Material {
float Brightness;
Color DiffuseColor; };
struct Wall {
union {
struct {
float SurfaceBrightness;
struct {
float SurfaceDiffuseColorRed;
float SurfaceDiffuseColorGreen;
float SurfaceDiffuseColorBlue; }; };
Material Surface; }; };
int main() {
Wall W;
float Wall::* ParamToAnimate;
ParamToAnimate = &Wall::SurfaceDiffuseColorRed;
std::cin >> W.*ParamToAnimate;
std::cout << W.Surface.DiffuseColor.Red << std::endl;
return 0; }
§9.2
14
如果两个 POD-struct(第 9 条)类型具有相同数量的非静态数据成员,并且相应的非静态数据成员(按顺序)具有布局兼容类型(3.9),则它们是布局兼容的。