如何在未命名struct内部获取其自身的类类型?
能否在未命名struct定义内部获取自身类型?
答案是:标准C++里,没法直接在未命名struct的定义顶层拿到自身类型——因为它没有名字,没法直接引用。你试过的两种方法行不通,本质上也是因为这个原因:
为什么你的尝试失败?
- 成员函数指针路子走不通:成员函数指针的类型必须明确写出所属类,比如
void (MyStruct::*)(),但匿名结构体连名字都没有,你根本填不出MyStruct这个部分,自然没法提取类型。 - static_cast也没戏:static_cast要求你指定目标类型,可匿名结构体没名字,你连要转成啥类型都写不出来,更别说用它了。
能实现需求的变通方法
如果一定要在结构体内部用到自身类型,有两种可行的路子:
1. 在成员函数里用decltype(*this)拿类型
虽然结构体顶层用不了,但在成员函数内部,this指针是存在的,你可以通过decltype(*this)获取当前结构体的类型:
auto obj = []{ struct { void print_self_type() { using Self = decltype(*this); // 现在Self就是这个匿名结构体的类型 Self* self_ptr = this; // 可以正常用Self做各种操作,比如定义变量、指针 } } s; return s; }();
2. 用局部命名结构体替代完全匿名
如果需要在结构体的顶层(比如定义成员指针、类型别名)用到自身类型,最稳妥的办法是给结构体一个局部名字——这个名字只在当前作用域有效,外部访问不到,近似“匿名”的效果:
void some_func() { struct TempStruct { using Self = TempStruct; Self* self_ptr; // 直接用自身类型定义成员 Self duplicate() { return Self{}; } } instance; // 外部没法直接访问TempStruct,满足你想要的“匿名”需求 }
小结
- 严格的未命名struct,顶层作用域里拿不到自身类型;
- 成员函数内部可以靠
decltype(*this)间接拿到; - 要在顶层用自身类型,局部命名结构体是性价比最高的替代方案。
内容的提问来源于stack exchange,提问作者user24551355
相关产品推荐
相关产品推荐

