std::is_same用于编译期判断两个类型是否完全相同,其value成员在类型匹配时为true,否则false,比较结果受const、volatile、引用等影响;C++14提供简写std::is_same_v;常用于if constexpr、模板特化和SFINAE中实现类型分支或约束。

std::is_same 是 C++ 标准库中 value 获取结果。
基本用法
std::is_same 在 T 和 U 是同一个类型时为 true,否则为 false。这个比较是精确的,包括 const、volatile、引用等都会影响结果。
示例代码:
#include zuojiankuohaophpcntype_traitsyoujiankuohaophpcn
#include zuojiankuohaophpcniostreamyoujiankuohaophpcn
int main() {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::boolalpha;
std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::is_samezuojiankuohaophpcnint, intyoujiankuohaophpcn::value zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // true
std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::is_samezuojiankuohaophpcnint, const intyoujiankuohaophpcn::value zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // false
std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::is_samezuojiankuohaophpcnint, int&youjiankuohaophpcn::value zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // false
std::cout zuojiankuohaophpcnzuojiankuohaophpcn std::is_samezuojiankuohaophpcnint, longyoujiankuohaophpcn::value zuojiankuohaophpcnzuojiankuohaophpcn "\n"; // false
}结合 if constexpr 使用(C++17)
在模板编程中,常配合 if constexpr 实现编译期分支,根据类型是否相同执行不同逻辑。
立即学习“C++免费学习笔记(深入)”;
template zuojiankuohaophpcntypename Tyoujiankuohaophpcn
void process(const T& value) {
if constexpr (std::is_same_vzuojiankuohaophpcnT, intyoujiankuohaophpcn) {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Processing int: " zuojiankuohaophpcnzuojiankuohaophpcn value zuojiankuohaophpcnzuojiankuohaophpcn "\n";
} else if constexpr (std::is_same_vzuojiankuohaophpcnT, std::stringyoujiankuohaophpcn) {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Processing string: " zuojiankuohaophpcnzuojiankuohaophpcn value zuojiankuohaophpcnzuojiankuohaophpcn "\n";
} else {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Unsupported type\n";
}
}注意:C++14 起提供了变量模板简写 std::is_same_v,等价于 std::is_same,更简洁。
在模板特化和 SFINAE 中的应用
可用于控制函数模板的启用条件,比如使用 enable_if_t 限制参数类型。
#include zuojiankuohaophpcntype_traitsyoujiankuohaophpcn
template zuojiankuohaophpcntypename Tyoujiankuohaophpcn
std::enable_if_tzuojiankuohaophpcnstd::is_same_vzuojiankuohaophpcnT, doubleyoujiankuohaophpcn, voidyoujiankuohaophpcn
special_func(T value) {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Called with double: " zuojiankuohaophpcnzuojiankuohaophpcn value zuojiankuohaophpcnzuojiankuohaophpcn "\n";
}
template zuojiankuohaophpcntypename Tyoujiankuohaophpcn
std::enable_if_tzuojiankuohaophpcn!std::is_same_vzuojiankuohaophpcnT, doubleyoujiankuohaophpcn, voidyoujiankuohaophpcn
special_func(T value) {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Not a double\n";
}常见注意事项
- 类型必须完全匹配,int 和 unsigned int 不同。
- 指针类型也要注意,int* 和 const int* 不一样。
- 引用类型:int& 和 int 被视为不同类型。
- 可用 std::remove_const_t、std::decay_t 等辅助 trait 先标准化类型再比较。
基本上就这些,std::is_same 是类型判断的基础工具,搭配其他 type traits 和模板机制能实现灵活的泛型逻辑。











