模板函数 重载/特化

?见代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

#include <iostream>

#include <vector>

using namespace std;

template<typename T>

T max(T a,T b,T c)

{

    cout<<"primary template"<<endl;

    if(b>a)

    {

        a=b;

    }

    if(c>a)

    {

        a=c;

    }

    return a;

}

//形参个数不同的重载

template<typename T>

T max(T a, T b, T c, T d)

{

    cout<<"override"<<endl;

    if(b>a)

    {

        a=b;

    }

    if(c>a)

    {

        a=c;

    }

    return a;

}

//特化T max(T a,T b,T c)

#if 0   //ok

template<>

int max<int>(int a, int b, int c)

#else

//ok: explicit template argument int deduced fromparameter types

template<>

int max(int a, int b, int c)

#endif

{

    cout<<"template specialization"<<endl;

    if(b>a)

    {

        a=b;

    }

    if(c>a)

    {

        a=c;

    }

    return a;

}

//仅演示全特化/偏特化

template<typename T1>

bool min_test(T1 a, T1 b)

{

    cout<<"min_test: primary template"<<endl;

    return true;

}

#if 1

template<>

bool min_test<int>(int a, int b)

{

    cout<<"min_test: full template specialization"<<endl;

    return true;

}

#endif

//全特化:全部参数指定类型

//偏特化:部分参数指定类型

#if 0

//error: function template partial specialization ‘min_test<T1, int>’ is not allowed

template<typename T1, typename T2>

bool min_test<T1, int>(T1 a, int b)

{

    cout<<"min_test: partial template specialization"<<endl;

    return true;

}

#endif

typedef struct myval_s

{

    int val0;

    int val1;

}myval_t;

int main( )

{

    int     i1=185,     i2=-76,     i3=567,     i;

    double  d1=56.87,   d2=90.23,   d3=-3214.78,d;

    long    g1=67854,   g2=-912456, g3=673456,  g;

    i=max(i1,i2,i3);

    cout<<"i_max="<<i<<endl<<endl;

    d=max(d1,d2,d3);

    cout<<"f_max="<<d<<endl<<endl;

    

    g=max(g1,g2,g3);

    cout<<"g_max="<<g<<endl<<endl;

    g=max(g1,g2,g3,g3);

    cout<<"g_max="<<g<<endl<<endl;

    min_test(i1, i2);

    min_test(d1, d2);

    

    return 0;

}

来自为知笔记(Wiz)

时间: 2024-10-13 12:29:21

模板函数 重载/特化的相关文章

模板函数的特化

模板特化:就是在实例化模板时,对特定类型的实参进行特殊处理,即实例化一个特殊的实例版本, 当以特化定义时的形参使用模板时,将调用特化版本,模板特化分为全特化和偏特化: 1. 函数模板的特化,只能全特化: //泛型版本 template <class T> int compare(const T &v1, const T &v2) { if(v1 < v2) return -1; if(v2 > v1) return 1; return 0; } 对于该函数模板,当实

C++普通函数与模板函数以及特化函数重载的优先级问题

在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编程啊什么的,但真正用到工作中的我相信很少,不久你也会忘掉,所以,对于模板,我们可以采取用到哪学到哪的观念去学习,这样可以节省时间并且让效率最大化. 今天主要讲在关于模板特化已经函数重载的问题,简单举下例子 1 void say(int value); 2 template <typename T>

函数模板示例(三) 模板函数的特化与重载

function3.h中的代码: #ifndef FUNCTION3_H #define FUNCTION3_H #include <string> #include <cstring> #include <iostream> template <typename T> T myMax(const T p1, const T p2) { std::cout << "template default func" <<

聊聊C++模板函数与非模板函数的重载

函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前几天在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: 1 template <typename T> 2 int compare(const T& lhs, const T& rhs)

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

C++ 模板函数 知多少?

要讲模板函数,我们先来看个例子,假如老板要让你写一个排序函数,假定最开始用户的要求可能只是 int .那么你花了大把功夫写了一段代码: void Sort(int* begin, int* end, bool(*cmp)(int, int)) //第三个参数是优先级函数,在这里我就简单用的冒泡排序.如果不会排序的请不要深究排序实现过程. { int* i, *j; for (i = begin; i != end; i++) { int* max = i; for (j = i + 1; j !

函数模板和模板函数

1.1函数模板的声明函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数.函数模板的声明形式为:template<typename 数据类型参数标识符><返回类型><函数名>(参数表){ 函数体}其中,template是定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符的关键字,用以说明它后面的标识符是数据类型标识符.这样,在以

函数模板与模板函数

1.函数指针--指针函数  函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: int*   fun(); 2.数组指针--指针数组  数组指针的重点是指针.表示的是一个指针,它指向的是一个数组,例子: int   (*pa)[8]; 指针数组的重点是数组.表示的是一个数组,它包含的元素是指针.例子; int*   ap[8]; 3.类模板--模板类(class   template-