`
qqsunkist
  • 浏览: 33002 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论
阅读更多

一、定义 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. 确保所有形式的重载函数都被写在它们的被呼叫点之前。

 

分享到:
评论

相关推荐

    C++ 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 ...

    C++ Templates-The Complete Guide.pdf

    在C++中,模板分为两种主要类型:函数模板(Function Templates)和类模板(Class Templates)。 函数模板允许我们定义一个函数的通用形式,然后编译器会生成一个特定类型的实例版本,这样就不需要为每一种数据类型...

    C++ Templates The Complete Guide (2nd Edition)

    -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 ...

    Advanced Metaprogramming in Classic C++

    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 ...

    C++ Templates 第二版 纯英文版 - David Vandevoorde1

    在“1.1 A First Look at Function Templates”这一章节中,作者首先介绍了C++中的函数模板。函数模板是C++中一种泛型编程的关键工具,它允许我们定义一个通用的函数,可以处理多种数据类型。1.1.1节“Defining the ...

    面向对象程序设计英文教学课件:12-Templates.pptx

    1. 函数模板(Function Templates) 函数模板是一种通用函数定义,它不是具体的函数,而是一个可以生成多个具体函数的蓝图。通过使用类型参数(formal template type parameter),函数模板可以在编译时为不同数据...

    c20-programmers-3rd.epub

    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

    C++标准模版 很好的资料

    - **功能模板(Function Templates):** 第一部分介绍了功能模板的基础概念,包括如何定义和使用功能模板、参数推导、模板参数以及功能模板的重载。 - **类模板(Class Templates):** 第一部分还涵盖了类模板的相关...

    c++primer练习题

    4. **Chapter 09 (ch09)**:讲解了模板(templates),包括函数模板(function templates)和类模板(class templates)。这使得代码可以处理不同类型的数据,实现泛型编程(generic programming)。 5. **Chapter ...

    Exploring C++ 11

    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 ...

    C++ STL 中文版 C++ STL 中文版 C++ STL 中文版

    模板包括类模板(class templates)和函数模板(function templates),例如`std::vector`和`std::sort`都是模板。 总的来说,C++ STL是一套强大的工具集,能够帮助开发者编写出高效、模块化和易于维护的C++代码。...

    follow me to study modern c++.zip

    函数模板(Function Templates)和类模板(Class Templates)是C++泛型编程的核心。模板元编程(Template Metaprogramming)允许我们在编译时进行计算,进一步增强了C++的灵活性。例如,Boost库中的Type Traits和...

    C++ template examples

    模板可以应用于类(class templates)和函数(function templates),为编写灵活、可重用的代码提供了便利。以下是对每个压缩包子文件中可能包含的知识点的详细解释: 1. **Makefile.h** 和 **Makefile**: 这些文件...

    c++primer第五版习题答案(第19章)

    2. 函数模板(Function Templates)允许对不同数据类型采用相同的算法。模板定义时,使用尖括号()来指定模板参数。 3. 类模板(Class Templates)允许创建通用的数据结构,例如标准模板库(STL)中的vector、list...

    Addison.Wesley.C++.by.Dissection.2002.pdf

    - **Function Templates:** Describes function templates. - **Generic Code Development: Quicksort:** Provides a generic version of the quicksort algorithm. - **Class Templates:** Discusses class ...

Global site tag (gtag.js) - Google Analytics