如何在C++中使用模板同时获取值类型与指针类型的value_type?
实现C++类型萃取器:获取值类型或指针的底层类型
当然可以帮你搞定这个需求!你要的其实是一个类型萃取工具——当模板参数是普通值类型时直接返回它本身,当是指针类型时返回其指向的底层值类型。C++里没法直接在模板typedef里用三元运算符(因为那是运行时逻辑,而模板是编译期操作),不过咱们可以用模板偏特化来实现编译期的类型判断。
基础实现:仅解一层指针
如果你只需要处理单层指针(比如int*解为int,但int**保留为int*),可以这样写:
#include <iostream> // 通用模板:匹配所有非指针类型 template <class T> struct TypeInfo { using value_type = T; // 非指针类型直接返回自身 }; // 偏特化模板:匹配指针类型 template <class T> struct TypeInfo<T*> { using value_type = T; // 指针类型返回其指向的底层类型 }; // 测试示例 int main() { // 测试值类型 std::cout << "sizeof(TypeInfo<int>::value_type): " << sizeof(TypeInfo<int>::value_type) << std::endl; // 输出4(32位系统) // 测试单层指针 std::cout << "sizeof(TypeInfo<int*>::value_type): " << sizeof(TypeInfo<int*>::value_type) << std::endl; // 同样输出4 // 测试双层指针(当前版本返回int*) std::cout << "sizeof(TypeInfo<int**>::value_type): " << sizeof(TypeInfo<int**>::value_type) << std::endl; // 输出8(指针大小) }
扩展实现:递归解多层指针
如果你的需求是不管多少层指针,都要解到最底层的非指针类型(比如int**解为int),可以改成递归特化的版本:
// 通用模板:匹配非指针类型 template <class T> struct TypeInfo { using value_type = T; }; // 指针类型递归特化:不断解引用指针直到得到非指针类型 template <class T> struct TypeInfo<T*> { using value_type = typename TypeInfo<T>::value_type; }; // 测试示例 int main() { std::cout << "sizeof(TypeInfo<int**>::value_type): " << sizeof(TypeInfo<int**>::value_type) << std::endl; // 现在输出4,即int的大小 }
额外福利:使用标准库现成工具
其实C++标准库已经提供了类似的类型萃取工具,如果你不想自己实现,可以用<type_traits>里的std::remove_pointer_t:
#include <type_traits> // 等价于基础版TypeInfo的value_type using IntValue = std::remove_pointer_t<int>; // 类型是int using IntPtrValue = std::remove_pointer_t<int*>; // 类型是int using IntDoublePtrValue = std::remove_pointer_t<int**>; // 类型是int*(仅解一层)
如果需要递归解多层指针,标准库没有直接对应的工具,还是自己写递归特化最方便。
这样实现的TypeInfo完全满足你后续用sizeof(TypeInfo<某个类型>::value_type)的需求,所有逻辑都是编译期完成的,不会有运行时开销。
内容的提问来源于stack exchange,提问作者sunkue
相关产品推荐
相关产品推荐

