一、定义 Function Template
template <typename T>
inline const T& max(const T& a, const T& b)
{
return a<b ? a : b;
}
二、参数推导
当使用某一类型的参数调用max()时,模板参数(template parameter)将以调用参数的类型确定下来。如下述代码
int main()
{
max(4, 7); // ok, 两个T都被推导为int
max(4, 4.2); // error: 第一个T被推导为int,第二个T被推导为double
}
三种方法解决error问题
1)把两个参数转型为相同数据类型
max(static_cast<double>(4), 4.2);
2)明确指定T的类型
max<double>(4, 4.2);
3)修改function template的模板参数为两个不同的类型;
三、模板参数
模板参数有两种:
I: template parameter (模板参数),在function template的一对尖括号里声明;
template <typename T
>
II:call parameter,在function template名称后的小圆括号中声明;
max(const T& a, const T& b
);
template parameter的数量不限(如果不觉得难看的话),但是不能在function template预设默认值。
按照3)的方法可以修改max的定义如下
template <typename T1, typename T2>
inline T1 max(const T1& a, const T2& b)
{
return a<b ? b : a;
}
...
max(4, 4.2); //比如此处调用返回值类型想为double, 实际返回类型为int。
上述方法明显有不足之处,返回值必须是参数类型中的一个,而不能动态决定; 另一个不足之处是,由于发生了类型cast,导致临时对象产生,因此返回值不能为引用。
由于T的类型由调用参数决定,因此我们把T与call parameter之间的关联,称为function template argument deduction (函数模板参数推导)。这种机制允许调用function template如同调用non-function template一样。当然,developer也可以显示化地指定template parameter的类型,例如
max<double>(4, 4.2);
不过推导过程,并不包含返回值类型的推导;假如,我们有如下版本的max function template
template <typename T1, typename T2, typename RT>
inline RT max (const T1& a, const T2& b);
max<int, double, double>(4, 4.2); //ok, but redundant.
在本例中,返回类型RT必须在调用max时明确指定;不过调用起来显得如此拖沓冗长。这样的调用,function template的推导过程要么要求所有的模板参数全部显示指定,要么都不显示指定。但是如果我们修改下max function template的template parameter的顺序,像如下这样
template<typename RT, typename T1, typename T2>
inline RT max (const T1& a, const T2& b);
max<double>(4, 4.2);
那么调用时,只需指定第一个template parameter就可以了。
四、重载Function Template
Function template与non-function template 函数一样,可以重载;
小结
1. Function templates 可以针对不同的template arguments定义一整族函数;
2. Function templates 讲依照传递而来的参数的类型而被具现化;
3. 可以明确指出template parameters;
4. Function templates 可以被重载;
5. 重载Function templates时,不同的重载形式之间最好只存在【绝对必要差异】
6. 确保所有形式的重载函数都被写在它们的被呼叫点之前。
分享到:
相关推荐
For programmers, who just use templates, who provide class and function templates, and who provide generic and foundation libraries Covering C++11, C++14, and C++17 Explaining all type traits of the ...
在C++中,模板分为两种主要类型:函数模板(Function Templates)和类模板(Class Templates)。 函数模板允许我们定义一个函数的通用形式,然后编译器会生成一个特定类型的实例版本,这样就不需要为每一种数据类型...
-For programmers, who just use templates, who provide class and function templates, and who provide generic and foundation libraries -Covering C++11, C++14, and C++17 -Explaining all type traits of ...
The classic C++ language admits two basic types of templates—function templates and class templates2: Here is a function template: template scalar_t sq(const scalar_t& x) { return x*x; } Here is a ...
在“1.1 A First Look at Function Templates”这一章节中,作者首先介绍了C++中的函数模板。函数模板是C++中一种泛型编程的关键工具,它允许我们定义一个通用的函数,可以处理多种数据类型。1.1.1节“Defining the ...
1. 函数模板(Function Templates) 函数模板是一种通用函数定义,它不是具体的函数,而是一个可以生成多个具体函数的蓝图。通过使用类型参数(formal template type parameter),函数模板可以在编译时为不同数据...
Written for programmers with a background in another high-level language, C++20 for Programmers applies the Deitel signature live-code approach to...Defining custom function templates and class templates
- **功能模板(Function Templates):** 第一部分介绍了功能模板的基础概念,包括如何定义和使用功能模板、参数推导、模板参数以及功能模板的重载。 - **类模板(Class Templates):** 第一部分还涵盖了类模板的相关...
4. **Chapter 09 (ch09)**:讲解了模板(templates),包括函数模板(function templates)和类模板(class templates)。这使得代码可以处理不同类型的数据,实现泛型编程(generic programming)。 5. **Chapter ...
Build your own function templates, namespaces and containers from the ground up. Put everything together to create sophisticated programs that work with pointers, dynamic memory and overloaded ...
模板包括类模板(class templates)和函数模板(function templates),例如`std::vector`和`std::sort`都是模板。 总的来说,C++ STL是一套强大的工具集,能够帮助开发者编写出高效、模块化和易于维护的C++代码。...
函数模板(Function Templates)和类模板(Class Templates)是C++泛型编程的核心。模板元编程(Template Metaprogramming)允许我们在编译时进行计算,进一步增强了C++的灵活性。例如,Boost库中的Type Traits和...
模板可以应用于类(class templates)和函数(function templates),为编写灵活、可重用的代码提供了便利。以下是对每个压缩包子文件中可能包含的知识点的详细解释: 1. **Makefile.h** 和 **Makefile**: 这些文件...
2. 函数模板(Function Templates)允许对不同数据类型采用相同的算法。模板定义时,使用尖括号()来指定模板参数。 3. 类模板(Class Templates)允许创建通用的数据结构,例如标准模板库(STL)中的vector、list...
- **Function Templates:** Describes function templates. - **Generic Code Development: Quicksort:** Provides a generic version of the quicksort algorithm. - **Class Templates:** Discusses class ...