You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在未命名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:18:30