Table of Contents
1. Function template
2. Class template
Home Backend Development C#.Net Tutorial In-depth analysis of C++ function templates and class templates

In-depth analysis of C++ function templates and class templates

Aug 10, 2018 pm 02:10 PM

1. Function template

1. Definition

template
Return value type template name (formal parameter list){
Function body
};

1

2

3

4

5

6

template <class T1, class T2>

T2 print(T1 arg1, T2 arg2)

{

    cout<< arg1 << " "<< arg2<<endl;

    return arg2;

}

Copy after login

2. Instantiate function template without parameters

1

2

3

4

5

6

7

8

9

10

#include <iostream>

using namespace std;

template <class T>

T Inc(T n){

    return 1 + n;

}

int main(){

    cout << Inc<double>(4)/2; //输出 2.5

    return 0;

}

Copy after login

3. Function templates can be overloaded, as long as their formal parameter lists or type parameter lists are different

1

2

3

4

5

6

7

8

9

10

11

12

template<class T1, class T2>

void print(T1 arg1, T2 arg2) {

    cout<< arg1 << " "<< arg2<<endl;

}

template<class T>

void print(T arg1, T arg2) {

    cout<< arg1 << " "<< arg2<<endl;

}

template<class T,class T2>

void print(T arg1, T arg2) {

    cout<< arg1 << " "<< arg2<<endl;

}

Copy after login

4. The order of function templates and functions

When there are multiple When the function and function template have the same name, the compiler processes a function call statement as follows

  • . First, it looks for an ordinary function (a function that is not instantiated from the template) whose parameters match exactly.

  • Find a template function with exactly matching parameters.

  • Find an ordinary function whose real parameters can be matched after automatic type conversion.

  • If none of the above can be found, an error will be reported.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

template <class T>

T Max( T a, T b) {

    cout << "TemplateMax" <<endl; return 0;

}

template <class T,class T2>

T Max( T a, T2 b) {

    cout << "TemplateMax2" <<endl; return 0;

}

double Max(double a, double b){

    cout << "MyMax" << endl; return 0;

}

int main() {

    Max( 1.2,3.4);     // 输出MyMax

    Max(4, 5);         //输出TemplateMax

    Max( 1.2, 3);      //输出TemplateMax2

    return 0;

}

Copy after login

5. When matching template functions, automatic type conversion is not performed

1

2

3

4

5

6

7

template<class T>

T myFunction( T arg1, T arg2)

{ cout<<arg1<<" "<<arg2<<"\n"; return arg1;}

……

myFunction( 5, 7);      //ok :replace T with int

myFunction( 5.8, 8.4);  //ok: : replace T with double

myFunction( 5, 8.4);    //error ,no matching function for callto &#39;myFunction(int, double)&#39;

Copy after login

2. Class template

1. Definition

When defining a class, add one/more type parameters. When using class templates, you specify how type parameters should be replaced with specific types, and the compiler generates corresponding template classes accordingly.

template //type parameter list
class class template name{
                                                           };

(1) How to write member functions in class templates:

template //Type parameter table
Return value type class template name ::Member function name (parameter list) {
         …  …
      }
(2) How to define an object using a class template:
Class template name Object name (constructor actual parameter list);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// Pair类模板

template <class T1,class T2>

class Pair{

public:

    T1 key; //关键字

    T2 value; //值

    Pair(T1 k,T2 v):key(k),value(v) { };

    bool operator < ( const Pair<T1,T2> & p) const;

};

template<class T1,class T2>

bool Pair<T1,T2>::operator < ( const Pair<T1,T2> & p) const//Pair的成员函数 operator <

    return key < p.key;

}

int main(){

    Pair<string,int> student("Tom",19);   //实例化出一个类 Pair<string,int>

    cout << student.key << " " << student.value;

    return 0;

}

//输出:

Tom 19

Copy after login

2. Use class template to define objects

  • The compiler is The process of generating a class from a class template is called instantiation of the class template. A class instantiated from a class template is called a template class.

  • Two template classes of the same class template are incompatible.

3. Function template as a class template member

1

2

3

4

5

6

template <class T>

class A{

    public:

        template<class T2>

        void Func( T2 t) { cout << t; } //成员函数模板

};

Copy after login

4. Class template and non-type parameters: The "" of the class template can be Non-type parameters appear

1

2

3

4

5

6

7

8

9

10

11

template <class T, int size>

class CArray{

    T array[size];

public:

    void Print(){

        for( int i = 0;i < size; ++i)

        cout << array[i] << endl;

    }

};

CArray<double,40> a2;

CArray<int,50> a3;     //a2和a3属于不同的类

Copy after login

5. Class templates and derivation

(1) Class templates are derived from class templates

1

2

3

4

5

6

7

8

9

10

11

12

template <class T1,class T2>              int main() {

class A {                                        B<int,double> obj1;

    T1 v1; T2 v2;                                C<int> obj2;

};                                               return 0;

template <class T1,class T2>              }

class B:public A<T2,T1> {                 class B<int,double>:

    T1 v3; T2 v4;                             public A<double,int>{

};                                            int v3; double v4;

template <class T>                        };

class C:public B<T,T> {

    T v5;

};

Copy after login

(2) Class templates are derived from template classes

1

2

3

4

5

6

7

8

9

10

11

12

template <class T1,class T2>

class A {

    T1 v1; T2 v2;

};

template <class T>

class B:public A<int,double> {

    T v;

};

int main() {

    B<char> obj1;     //自动生成两个模板类 :A<int,double> 和 B<char>

    return 0;

}

Copy after login

(3) Class templates are derived from ordinary classes

1

2

3

4

5

6

7

8

9

10

11

class A {

    int v1;

};

template <class T>

    class B:public A { //所有从B实例化得到的类 ,都以A为基类

    T v;

};

int main() {

    B<char> obj1;

    return 0;

}

Copy after login

(4) Ordinary classes are derived from template classes

1

2

3

4

5

6

7

8

9

10

11

12

template <class T>

class A {

    T v1;

    int n;

};

class B:public A<int> {

    double v;

};

int main() {

    B obj1;

    return 0;

}

Copy after login

6. Class templates and friend functions

(1 ) Functions, classes, and member functions of classes serve as friends of class templates

1

2

3

4

5

6

7

8

9

10

11

12

void Func1() { }

class A { };

class B{

    public:

        void Func() { }

};

template <class T>

class Tmpl{

    friend void Func1();

    friend class A;

    friend void B::Func();

}; //任何从Tmp1实例化来的类 ,都有以上三个友元

Copy after login

(2) Function templates serve as friends of class templates

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

#include <iostream>

#include <string>

using namespace std;

template <class T1,class T2>

class Pair{

    private:

        T1 key; //关键字

        T2 value; //值

    public:

        Pair(T1 k,T2 v):key(k),value(v) { };

        bool operator < ( const Pair<T1,T2> & p) const;

        template <class T3,class T4>

        friend ostream & operator<< ( ostream & o,const Pair<T3,T4> & p);

};

template <class T1,class T2>

bool Pair<T1,T2>::operator < ( const Pair<T1,T2> & p) const{ //"小"的意思就是关键字小

    return key < p.key;

}

template <class T1,class T2>

ostream & operator<< (ostream & o,const Pair<T1,T2> & p){

    o << "(" << p.key << "," << p.value << ")" ;

    return o;

}

int main()

{

    Pair<string,int> student("Tom",29);

    Pair<int,double> obj(12,3.14);

    cout << student << " " << obj;

    return 0;

}

//输出:

(Tom,29) (12,3.14)

任意从 template <class T1,class T2>

       ostream & operator<< (ostream & o,const Pair<T1,T2> & p)

生成的函数,都是任意Pair摸板类的友元

Copy after login

(3) Function templates serve as friends of classes

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

using namespace std;

class A

{

    int v;

public:

    A(int n):v(n) { }

    template <class T>

    friend void Print(const T & p);

};

template <class T>

void Print(const T & p){

    cout << p.v;

}

int main() {

    A a(4);

    Print(a);

    return 0;

}

//输出:4

Copy after login

(4) Class template as a friend of the class template

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

template <class T>

class B {

    T v;

public:

    B(T n):v(n) { }

    template <class T2>

    friend class A;

};

template <class T>

class A {

    public:

    void Func( )  {

        B<int> o(10);

        cout << o.v << endl;

    }

};

Copy after login

7. Class template and static member variables

Static members can be defined in the class template, then from the All classes instantiated from a class template contain the same static members.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include <iostream>

using namespace std;

template <class T>

class A{

    private:

        static int count;

    public:

        A() { count ++; }

        ~A() { count -- ; };

        A( A & ) { count ++ ; }

        static void PrintCount() { cout << count << endl; }

};

template<> int A<int>::count = 0;

template<> int A<double>::count = 0;

int main(){

    A<int> ia;

    A<double> da;

    ia.PrintCount();

    da.PrintCount();

    return 0;

}

//输出:1  1

Copy after login
Related recommendations:

Use C to analyze the C syntax format

c 11 - How to define a pointer to a function in C Smart pointers?

The above is the detailed content of In-depth analysis of C++ function templates and class templates. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to use char array in C language How to use char array in C language Apr 03, 2025 pm 03:24 PM

The char array stores character sequences in C language and is declared as char array_name[size]. The access element is passed through the subscript operator, and the element ends with the null terminator '\0', which represents the end point of the string. The C language provides a variety of string manipulation functions, such as strlen(), strcpy(), strcat() and strcmp().

How to handle special characters in C language How to handle special characters in C language Apr 03, 2025 pm 03:18 PM

In C language, special characters are processed through escape sequences, such as: \n represents line breaks. \t means tab character. Use escape sequences or character constants to represent special characters, such as char c = '\n'. Note that the backslash needs to be escaped twice. Different platforms and compilers may have different escape sequences, please consult the documentation.

What is the role of char in C strings What is the role of char in C strings Apr 03, 2025 pm 03:15 PM

In C, the char type is used in strings: 1. Store a single character; 2. Use an array to represent a string and end with a null terminator; 3. Operate through a string operation function; 4. Read or output a string from the keyboard.

How to use various symbols in C language How to use various symbols in C language Apr 03, 2025 pm 04:48 PM

The usage methods of symbols in C language cover arithmetic, assignment, conditions, logic, bit operators, etc. Arithmetic operators are used for basic mathematical operations, assignment operators are used for assignment and addition, subtraction, multiplication and division assignment, condition operators are used for different operations according to conditions, logical operators are used for logical operations, bit operators are used for bit-level operations, and special constants are used to represent null pointers, end-of-file markers, and non-numeric values.

The difference between multithreading and asynchronous c# The difference between multithreading and asynchronous c# Apr 03, 2025 pm 02:57 PM

The difference between multithreading and asynchronous is that multithreading executes multiple threads at the same time, while asynchronously performs operations without blocking the current thread. Multithreading is used for compute-intensive tasks, while asynchronously is used for user interaction. The advantage of multi-threading is to improve computing performance, while the advantage of asynchronous is to not block UI threads. Choosing multithreading or asynchronous depends on the nature of the task: Computation-intensive tasks use multithreading, tasks that interact with external resources and need to keep UI responsiveness use asynchronous.

How to convert char in C language How to convert char in C language Apr 03, 2025 pm 03:21 PM

In C language, char type conversion can be directly converted to another type by: casting: using casting characters. Automatic type conversion: When one type of data can accommodate another type of value, the compiler automatically converts it.

What is the function of C language sum? What is the function of C language sum? Apr 03, 2025 pm 02:21 PM

There is no built-in sum function in C language, so it needs to be written by yourself. Sum can be achieved by traversing the array and accumulating elements: Loop version: Sum is calculated using for loop and array length. Pointer version: Use pointers to point to array elements, and efficient summing is achieved through self-increment pointers. Dynamically allocate array version: Dynamically allocate arrays and manage memory yourself, ensuring that allocated memory is freed to prevent memory leaks.

Avoid errors caused by default in C switch statements Avoid errors caused by default in C switch statements Apr 03, 2025 pm 03:45 PM

A strategy to avoid errors caused by default in C switch statements: use enums instead of constants, limiting the value of the case statement to a valid member of the enum. Use fallthrough in the last case statement to let the program continue to execute the following code. For switch statements without fallthrough, always add a default statement for error handling or provide default behavior.

See all articles