泛型函数必须在函数声明前加template,且定义需置于头文件中;参数类型应据大小和语义选t、const t&或t&&;返回类型依赖表达式时用decltype或auto配合尾置返回。

泛型函数怎么写,template 放哪儿最安全
直接在函数声明前加 template<typename t></typename>,这是唯一正确位置。放函数体内、返回值后、参数列表里都会编译失败。typename 和 class 在这里等价,但推荐用 typename,语义更准确——它强调“这是一个类型占位符”,不是非得类类型。
常见错误是把模板参数写成 template<t></t>(漏 typename)或 template<typename t u></typename>(多个参数漏逗号分隔),这些都会触发类似 expected a type 的错误。
-
T可以是任意类型:内置类型(int、double)、自定义类、甚至函数指针 - 不支持自动推导模板参数的场景(比如函数只含返回值类型,无参数),必须显式写出
func<int>(...)</int> - 模板函数不能分离声明和定义到 .h/.cpp 里——定义必须在头文件中可见,否则链接时找不到实例化体
参数类型怎么选:T 还是 const T& 还是 T&&
传参方式直接影响性能和语义。对大对象(如 std::vector、自定义类),用 const T& 避免拷贝;对小类型(int、char),按值传反而更高效;需要修改原值时用 T&;要支持移动语义就用 T&&(配合 std::forward)。
别默认全写 const T&:它会阻止对右值调用(比如 max(3, 5) 中的字面量),导致编译失败。真正通用的写法常需重载或使用完美转发。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 简单工具函数(如
min、swap)优先考虑const T&+ 值传递组合 - 若函数内部可能修改参数,且想影响实参,必须用
T& - 接受可变参数或转发时,
T&&是必要选择,但需搭配std::forward<t>(x)</t>使用
什么时候编译器推不出 T,必须手动指定
推导失败最常见于:参数类型不参与模板参数推导、返回值依赖 T 但参数没提供线索、或者用了默认模板参数但前面参数未完全指定。
例如 template<typename t> T make_value() { return T{}; }</typename>,调用 make_value() 必须写 make_value<int>()</int>,否则编译器不知道 T 是什么。又比如 template<typename t> void process(const std::vector<t>& v, T init)</t></typename>,如果只传 v 不传 init,T 仍可从 v 推出;但如果 init 类型和 v 元素类型不一致(比如传 long 初始化 std::vector<int></int>),推导就会失败。
- 函数对象或 lambda 作为模板参数时,编译器通常无法推导其类型,需用
auto或显式模板参数 - 涉及
std::function或类型擦除容器时,T往往需手动指定 - 启用 C++17 类模板参数推导(CTAD)后,某些构造函数可省略,但函数模板不享受该特性
泛型函数和 auto 返回值、decltype 怎么配合用
当返回类型依赖参数表达式结果时(比如两个数相加,返回类型应为 decltype(a + b)),不能硬写 int 或 double,要用尾置返回类型:auto func(...) -> decltype(...)。C++14 起允许直接用 auto 作返回类型,由编译器推导,但要求所有返回路径类型一致。
注意 decltype 对变量名和表达式的处理不同:decltype(x) 是变量声明类型,decltype((x)) 是引用类型。写错会导致意外的引用返回,引发悬垂引用问题。
- 算术运算建议用
decltype(std::declval<t>() + std::declval<u>())</u></t>避免实际构造对象 - 避免在返回类型中直接写
decltype(a + b)且a、b是局部变量——它们生命周期短,返回引用会出问题 - 若函数有多个分支返回不同类型(如
if分支返回int,else返回double),auto返回会编译失败,必须统一类型或改用std::common_type_t
nm 或编译器详细日志反查。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










