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

如何使用decltype从类型指针中获取原始数据类型?

如何从decltype(*ptr)中获取原始非引用类型

当对指针使用decltype(*ptr)时,确实会得到对应类型的左值引用(比如int*解引用后decltype返回int&),要获取原始的非引用类型,有两种可行方案:

方案1:不依赖任何库(C++11及以上)

自己实现一个简单的类型萃取模板,完全不需要外部库:

// 基础模板
template<typename T>
struct remove_reference {
    using type = T;
};

// 匹配左值引用的特化版本
template<typename T>
struct remove_reference<T&> {
    using type = T;
};

// 可选:匹配右值引用的特化版本,覆盖更多场景
template<typename T>
struct remove_reference<T&&> {
    using type = T;
};

// 辅助别名,简化使用(C++11支持)
template<typename T>
using remove_reference_t = typename remove_reference<T>::type;

使用示例:

int* i;
remove_reference_t<decltype(*i)> o; // 等价于int o;

方案2:依赖标准库(更简洁)

从C++11开始,标准库的<type_traits>头文件已经内置了std::remove_reference工具,直接调用即可:

#include <type_traits>

int* i;
// C++14及以上可用简化别名
std::remove_reference_t<decltype(*i)> o; // int o;

// 如果是C++11,用完整写法
typename std::remove_reference<decltype(*i)>::type o; // int o;

两种方案都能达到目的:自己实现的方式完全无依赖,标准库的方式更成熟简洁,适合实际项目中使用。核心原理都是通过模板特化匹配引用类型,提取出原始的非引用类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:45:59