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

