C++进阶 -- 泛型编程
泛型编程是一种编程范式其核心是通过参数化类型来编写可复用、类型安全的代码使得同一段算法或数据结构能适用于多种数据类型。它最早由 Alexander Stepanov 和 David Musser 在 1989 年提出初衷是为 C 构建高效的通用容器库如 STL。泛型编程的关键机制是将类型作为参数传入模板从而在编译时生成针对具体类型的代码避免重复实现相似逻辑。核心优势代码复用一次编写多种类型使用。类型安全编译时检查类型避免运行时类型转换错误。性能提升对值类型可避免装箱和拆箱操作提高执行效率。清晰意图代码逻辑更明确减少强制转换。应用STL 中的vectorT、mapT模板特化Specialization当通用模板逻辑不适用于某些特定类型时可以使用特化提供定制实现。分为全特化所有参数确定和偏特化部分参数确定或对参数进行限制。全特化为特定类型组合提供完全不同的实现。偏特化常用于类模板针对指针、引用或特定类别的类型提供优化或修正逻辑。建议函数模板通常优先使用重载而非特化因为重载解析规则更直观类模板则广泛使用特化来适配不同数据结构。#include iostream #include cstring #include string // 基础模板通用比较 templatetypename T bool IsEqual(const T a, const T b) { std::cout Using generic template std::endl; return a b; } // 全特化针对 const char* 使用 strcmp 比较内容而非地址 template bool IsEqualconst char*(const char* const a, const char* const b) { std::cout Using specialized template for const char* std::endl; if (!a || !b) return a b; return std::strcmp(a, b) 0; } int main() { int x 10, y 10; std::cout std::boolalpha IsEqual(x, y) std::endl; const char* str1 Hello; const char* str2 Hello; // 调用特化版本比较字符串内容 std::cout IsEqual(str1, str2) std::endl; return 0; }std::boolalpha是 C 标准库中的一个 I/O 操纵符Manipulator主要用于控制布尔值bool在输入输出流中的显示格式。它的核心作用是将布尔值的默认数字表示0/1切换为文本表示false/true。1. 为什么需要它在 C 中bool类型本质上是一种整数类型。默认情况下true被输出为 1false被输出为 0这在调试或日志记录时往往不够直观。使用std::boolalpha后程序会直接输出单词true或false大大提高了代码的可读性。2. 基本用法你需要包含头文件iostream#include iostream int main() { bool isReady true; bool isError false; // 默认行为输出数字 std::cout 默认: isReady , isError std::endl; // 输出: 默认: 1, 0 // 启用 boolalpha输出文本 std::cout std::boolalpha; std::cout 启用后: isReady , isError std::endl; // 输出: 启用后: true, false // 恢复默认行为使用 noboolalpha std::cout std::noboolalpha; std::cout 恢复后: isReady , isError std::endl; // 输出: 恢复后: 1, 0 return 0; }输入示例std::boolalpha同样适用于输入流如std::cin。未启用时只能输入0或1。输入其他数字或非数字字符可能导致失败或被视为false。启用后可以输入字符串true或false不区分大小写取决于 locale通常支持 true/false。3. 关键特性与注意事项状态持久性std::boolalpha是一个状态标志。一旦你在流中使用了它该流后续所有的bool输出都会保持文本格式直到你显式地使用std::noboolalpha将其关闭。它不会自动重置。仅影响 bool 类型它只改变bool类型的输出行为对int、char等其他类型没有影响。配合std::noboolalpha使用如果你希望在程序的某一部分输出文本格式的布尔值而在另一部分恢复为数字格式务必使用std::noboolalpha进行切换。底层原理它实际上是调用了流的setf(std::ios_base::boolalpha)方法设置格式标志位。std::noboolalpha则调用unsetf清除该标志。总结std::boolalpha让cout true输出true。std::noboolalpha让cout true输出1默认行为。用途提升日志、调试信息和用户交互界面的可读性。