C++中能否无需decltype关键字,实现类似is_type_same_v(a, int*[3])的类型判断
在C++中无需decltype判断变量与类型是否匹配的方法
C++标准库自带的std::is_same_v确实需要显式传入类型,没法直接用变量名作为模板参数(因为模板参数要求是类型,变量名是实体而非类型)。但你可以自己实现一个简单的工具来达到你想要的is_type_same_v<a, int(*)[3]>这种直观写法。
实现方案(C++20及以上)
利用C++20引入的auto非类型模板参数,可以写一个自定义的变量模板:
#include <type_traits> #include <iostream> // 自定义变量模板:直接接受变量和目标类型 template <auto& Var, typename TargetType> constexpr bool is_type_same_v = std::is_same_v<decltype(Var), TargetType>; int main() { int (*a)[3]; std::cout << is_type_same_v<a, int(*)[3]> << std::endl; // 输出1(true) std::cout << is_type_same_v<a, int[3]> << std::endl; // 输出0(false) return 0; }
这个模板的原理很简单:auto& Var捕获变量,通过decltype(Var)自动获取变量的类型,再和TargetType用std::is_same_v做比较,完全省去了手动写decltype的麻烦。
兼容C++17及更早版本的方案
如果你的编译器不支持C++20,可以用函数模板的方式实现类似效果:
#include <type_traits> #include <iostream> // 自己实现type_identity(C++20标准库自带,C++17及之前需要手动定义) template<typename T> struct type_identity { using type = T; }; template<typename T> using type_identity_t = typename type_identity<T>::type; // 辅助函数:推导变量类型,与目标类型比较 template <typename VarType, typename TargetType> constexpr bool is_type_same(const VarType&, type_identity_t<TargetType>) { return std::is_same_v<VarType, TargetType>; } int main() { int (*a)[3]; std::cout << is_type_same(a, type_identity_t<int(*)[3]>()) << std::endl; // 输出1 return 0; }
这里用type_identity来传递目标类型,避免临时对象构造的问题,同样能达到省略手动写decltype的目的。
为什么标准库不提供这种工具?
标准库的std::is_same设计初衷是针对类型之间的比较,而变量到类型的转换属于额外的语法糖场景。不过因为实现成本极低,自己写一个完全能满足需求。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

