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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:02:50