C++ 模板全部场景完整汇总(C++11‑C++17)包含:函数模板、类模板、变量模板、别名模板、模板模板参数、非类型模板参数、特化 (全 / 偏)、成员模板、继承与模板、CRTP、折叠表达式、if‑constexpr、SFINAE、Concept (C++20)。每个场景附带最小可编译示例。说明:C++ 模板分为:函数模板类模板变量模板 (C++14)别名模板 (C++11)模板模板参数 配套能力:特化、成员模板、继承、CRTP、SFINAE、if‑constexpr、Conceptcpp#include iostream #include vector #include type_traits #include string //============================================================ // 1. 函数模板 —— 基础类型模板参数 //============================================================ templatetypename T T maxVal(T a, T b) { return (a b) ? a : b; } void demo_func_template() { std::cout maxVal(1, 2) "\n"; std::cout maxVal(3.14, 2.71) "\n"; //显式指定模板参数 std::cout maxValdouble(5, 3.1) "\n"; } //============================================================ // 2. 函数模板:非类型模板参数(编译期常量) //============================================================ templateint N int mul(int x) { return N * x; } void demo_func_nontype() { std::cout mul10(2) "\n"; //10*2 } //============================================================ // 3. 类模板:类型参数 //============================================================ templatetypename T class Wrapper { public: T data; Wrapper(T v) : data(v) {} void print() const { std::cout data "\n"; } }; void demo_class_template() { Wrapperint w1(100); Wrapperstd::string w2("hello"); w1.print(); w2.print(); } //============================================================ // 4. 类模板:非类型模板参数(整数、枚举、指针、引用) //============================================================ enum class Op { Add, Sub }; templateOp OP, int N class Policy { public: int calc(int x) { if constexpr(OP == Op::Add) return x + N; else return x - N; } }; int g_global = 100; templateint* P class GlobalPtrWrap { public: void set(int v) { *P = v; } }; void demo_class_nontype() { PolicyOp::Add,5 p1; std::cout p1.calc(3) "\n"; GlobalPtrWrapg_global pw; pw.set(999); std::cout g_global "\n"; } //============================================================ // 5. 模板模板参数:参数本身是模板 //============================================================ templatetemplatetypename... class Container, typename T class Adapter { public: ContainerT cont; void push(T v) { cont.push_back(v); } }; void demo_template_template_param() { Adapterstd::vector, int adp; adp.push(10); } //============================================================ // 6. 模板默认参数 //============================================================ templatetypename T = int, int SIZE = 16 class Buffer { public: T buf[SIZE]{}; }; void demo_default_param() { Buffer b1; // T=int SIZE=16 Bufferdouble b2; // T=double SIZE=16 Bufferfloat,32 b3; } //============================================================ // 7. 成员模板:普通类内部的成员函数模板 //============================================================ class NormalClass { public: int base = 10; templatetypename T T add(T in) { return in + static_castT(base); } }; void demo_member_template() { NormalClass obj; std::cout obj.add(3.14) "\n"; } //============================================================ // 8. 类模板内部嵌套成员函数模板(两套模板) //============================================================ templatetypename X class OuterT { public: X x_val; OuterT(X v):x_val(v){} templatetypename T T combine(T t) { return t + static_castT(x_val); } }; void demo_nested_two_template() { OuterTint ot(20); auto res = ot.combine(1.5); std::cout res "\n"; } //============================================================ // 9. 全特化:类模板全特化;函数模板全特化 //============================================================ //主模板 templatetypename T class SpecDemo { public: void info() { std::cout "general\n"; } }; //全特化 bool template class SpecDemobool { public: void info() { std::cout "special bool\n"; } }; //函数模板全特化 templatetypename T void funcSpec(T){} template void funcSpecint(int){ std::cout "func spec int\n"; } void demo_full_specialization() { SpecDemoint a; a.info(); SpecDemobool b; b.info(); funcSpec(1); } //=====================