如何在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做两层校验:- 先确认当前类型本身是指针类型;
- 用
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
相关产品推荐
相关产品推荐

