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

如何使用decltype获取类型而非类型引用?

解决decltype(*p)返回引用的替代方案

根据C++标准,对指针p做解引用操作时,decltype(*p)会返回左值引用类型(因为解引用指针得到的是左值)。如果不能使用std::remove_reference,可以用以下几种方法获取原类型:

方法1:通过指针类型推导原类型

既然p是指针,decltype(p)的类型就是TargetType*,直接用std::remove_pointer_t去掉指针修饰即可得到原类型,完全绕开引用问题:

int main(int argc, char* argv[])
{   
    auto* p = getMyStruct();
    using TargetType = std::remove_pointer_t<decltype(p)>; // 直接拿到MyStruct<int>或MyStruct<double>
}

方法2:自己实现简易的引用移除模板

如果不想依赖标准库的类型工具,可以手动实现一个极简的remove_ref模板,用来剥离引用:

template<typename T>
struct remove_ref { using type = T; };
template<typename T>
struct remove_ref<T&> { using type = T; };
template<typename T>
struct remove_ref<T&&> { using type = T; };

int main(int argc, char* argv[])
{   
    auto* p = getMyStruct();
    using TargetType = typename remove_ref<decltype(*p)>::type; // 得到原类型
}

方法3:借助自动类型推导(限可拷贝类型)

如果目标类型支持拷贝构造,可以通过auto变量的类型推导间接获取原类型:

int main(int argc, char* argv[])
{   
    auto* p = getMyStruct();
    auto temp = *p; // auto推导会自动剥离引用
    using TargetType = decltype(temp); // 得到原类型
}

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:42:11