template <typename T>
T function() {
return T();
}
int main() {
cout << function<int>() << endl; // 显式指定模板参数类型
}
template<class A, class B>
auto foo(A a, B b) {
return a + b;
}
template<typename T>
int f(T)
{
return 1;
}
template<typename T>
int f(T*)
{
return 2;
}
int main()
{
std::cout << f(0) << std::endl; // 自动检测模板参数类型
std::cout << f((int*)0) << std::endl; // 显式指定模板参数类型
}
template<typename T1, typename T2>
auto max(T1 a, T2 b) {
return b < a ? a : b;
}
auto a = ::max(2, 3.2);
#include
// 多个参数的函数木板
template<typename RT, typename T1, typename T2>
RT max(T1 a, T2 b) {
using namespace std;
cout << "调用的自定义模板函数...... " << endl;
return b < a ? a : b;
}
double a = ::max(2, 3.2); // ERROR
double a = ::max<double, int, double>(2, 3.2); // CORRECT, 需要显式指定
double a = ::max<double>(2, 3.2); // CORRECT
Problem:
将Template放在某个编译单元中出现“无法解析外部符号”的ERROR。
Solution:
Analysis:
int test(1,3)
编译的过程中会生成int test(int, int)
这个函数,将参数实例化为int(特化引用)。如果没有函数模板调用的过程,就不会生成任何函数。模板调用顺序:
背景:template.h中声明了模板函数但是具体实现放在了template.cpp文件中,主函数中引用到testFunc的一个特化实例。编译过程中,template和Main分别编译为template.obj和Main.obj。
C++中使用函数模板出现“无法解析的外部符号”问题
C++ 函数模板的返回类型如何确定?
auto func(T parameters) -> type;
// 等价于
type func(T parameters);
auto 关键字只是一个占位符。
template <typename U, typename V>
auto add(U a, V b) -> decltype(a + b);
通过 a + b (函数参数)的型别推断出 add 函数的返回类型。
auto func(T param)
{
return xxx;
}
auto &
只能返回左值引用。auto &&
既能返回左值引用,又能返回右值引用。auto
只能返回一个型别。decltype(auto) func(T parameter)
{
return xxx;
}
https://zhuanlan.zhihu.com/p/377145104
enable_if 利用了模板匹配的技巧和struct结构, 巧妙的将条件匹配分割成两种情况,
一种是true的情况: 为结构绑定一个type
一种是false的情况: 采取留空策略
template <bool _Test, class _Ty = void>
struct enable_if {}; // no member "type" when !_Test
// 这个实现叫做部分具体化(partial specialization), 即: 第一个参数 () 采用具体值.
// 当调用时传递的参数是true时, 一定会进入这个函数.
// 当调用时传递的参数是true且不提供其他参数时, 会把自动合并上面一个enable_if的 ;
// 当调用时传递的参数是true且提供其他参数时, _Ty 会替换成传递参数的类型(放弃void).
template <class _Ty>
struct enable_if<true, _Ty> { // type is _Ty for _Test
using type = _Ty;
};
基于模板的 SFINAE 和 匿名类型参数 的基础概念上封装。
enable_if_t 强制使用 enable_if 的 ::type 来触发 SFINAE 规则, 如果失败则跳过当前匹配进入下一个匹配.。
=》 面向数据编程
概要设计(架构设计) -》集成测试
详细设计 =》 单元测试