如何使用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
相关产品推荐
相关产品推荐

