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

如何在C++17中编写is_pointer_pointer泛型lambda?

判断参数是否为指针的指针的泛型Lambda实现

这里给你一个经过优化的泛型Lambda实现,完美适配你的需求——判断传入参数是否为指针的指针类型:

#include <type_traits> // 需要包含这个头文件来使用类型特性工具

auto is_pointer_pointer = [] (auto arg) -> bool {
    // 先移除参数的引用类型(处理传入左值引用的情况)
    using ArgType = std::remove_reference_t<decltype(arg)>;
    // 两步判断:首先当前类型是指针,其次去掉一层指针后仍然是指针
    return std::is_pointer_v<ArgType> && std::is_pointer_v<std::remove_pointer_t<ArgType>>;
};

工作原理拆解

  • 第一步用std::remove_reference_t处理可能的引用类型:比如如果传入的是char**&(左值引用),我们需要先剥离引用,拿到原始的char**类型再做判断。
  • 然后通过std::is_pointer_v做两层校验:
    1. 先确认当前类型本身是指针类型;
    2. 用std::remove_pointer_t去掉一层指针后,剩下的类型依然是指针类型——这就说明原类型是指针的指针。

使用示例

在main函数里测试不同类型的参数,结果符合预期:

#include <iostream>

int main(int argc, char** argv) {
    // 传入char**,返回true
    std::cout << std::boolalpha << is_pointer_pointer(argv) << '\n'; // 输出 true
    
    int* single_ptr = nullptr;
    std::cout << is_pointer_pointer(single_ptr) << '\n'; // 输出 false
    
    int** double_ptr = nullptr;
    std::cout << is_pointer_pointer(double_ptr) << '\n'; // 输出 true
    
    int normal_val = 42;
    std::cout << is_pointer_pointer(normal_val) << '\n'; // 输出 false
    
    return 0;
}

这个实现兼顾了灵活性和准确性,不管是传入值类型还是引用类型的指针的指针,都能正确判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:11