


1. Function template
1. Definition
template
Return value type template name (formal parameter list){
Function body
};
template <class T1, class T2> T2 print(T1 arg1, T2 arg2) { cout<< arg1 << " "<< arg2<<endl; return arg2; }
2. Instantiate function template without parameters
#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; }
3. Function templates can be overloaded, as long as their formal parameter lists or type parameter lists are different
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; }
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.
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; }
5. When matching template functions, automatic type conversion is not performed
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 'myFunction(int, double)'
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
class class template name{
};
template
Return value type class template name
… …
}
(2) How to define an object using a class template:
Class template name// 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
- 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.
template <class T> class A{ public: template<class T2> void Func( T2 t) { cout << t; } //成员函数模板 };4. Class template and non-type parameters: The "
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属于不同的类5. Class templates and derivation (1) Class templates are derived from class templates
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; };(2) Class templates are derived from template classes
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; }(3) Class templates are derived from ordinary classes
class A { int v1; }; template <class T> class B:public A { //所有从B实例化得到的类 ,都以A为基类 T v; }; int main() { B<char> obj1; return 0; }(4) Ordinary classes are derived from template classes
template <class T> class A { T v1; int n; }; class B:public A<int> { double v; }; int main() { B obj1; return 0; }6. Class templates and friend functions
(1 ) Functions, classes, and member functions of classes serve as friends of class templates
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实例化来的类 ,都有以上三个友元(2) Function templates serve as friends of class templates
#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摸板类的友元(3) Function templates serve as friends of classes
#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(4) Class template as a friend of the class template
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; } };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.
#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 1Related 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!

C# is widely used in enterprise-level applications, game development, mobile applications and web development. 1) In enterprise-level applications, C# is often used for ASP.NETCore to develop WebAPI. 2) In game development, C# is combined with the Unity engine to realize role control and other functions. 3) C# supports polymorphism and asynchronous programming to improve code flexibility and application performance.

C# and .NET are suitable for web, desktop and mobile development. 1) In web development, ASP.NETCore supports cross-platform development. 2) Desktop development uses WPF and WinForms, which are suitable for different needs. 3) Mobile development realizes cross-platform applications through Xamarin.

The C#.NET ecosystem provides rich frameworks and libraries to help developers build applications efficiently. 1.ASP.NETCore is used to build high-performance web applications, 2.EntityFrameworkCore is used for database operations. By understanding the use and best practices of these tools, developers can improve the quality and performance of their applications.

How to deploy a C# .NET app to Azure or AWS? The answer is to use AzureAppService and AWSElasticBeanstalk. 1. On Azure, automate deployment using AzureAppService and AzurePipelines. 2. On AWS, use Amazon ElasticBeanstalk and AWSLambda to implement deployment and serverless compute.

The combination of C# and .NET provides developers with a powerful programming environment. 1) C# supports polymorphism and asynchronous programming, 2) .NET provides cross-platform capabilities and concurrent processing mechanisms, which makes them widely used in desktop, web and mobile application development.

.NETFramework is a software framework, and C# is a programming language. 1..NETFramework provides libraries and services, supporting desktop, web and mobile application development. 2.C# is designed for .NETFramework and supports modern programming functions. 3..NETFramework manages code execution through CLR, and the C# code is compiled into IL and runs by CLR. 4. Use .NETFramework to quickly develop applications, and C# provides advanced functions such as LINQ. 5. Common errors include type conversion and asynchronous programming deadlocks. VisualStudio tools are required for debugging.

C# is a modern, object-oriented programming language developed by Microsoft, and .NET is a development framework provided by Microsoft. C# combines the performance of C and the simplicity of Java, and is suitable for building various applications. The .NET framework supports multiple languages, provides garbage collection mechanisms, and simplifies memory management.

C# and .NET runtime work closely together to empower developers to efficient, powerful and cross-platform development capabilities. 1) C# is a type-safe and object-oriented programming language designed to integrate seamlessly with the .NET framework. 2) The .NET runtime manages the execution of C# code, provides garbage collection, type safety and other services, and ensures efficient and cross-platform operation.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Atom editor mac version download
The most popular open source editor

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

SublimeText3 Linux new version
SublimeText3 Linux latest version

DVWA
Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software
