Re-learning C ++ (12) templates' special and biased features

Source: Internet
Author: User

Re-learning C ++ (12) templates' special and biased features
1. template Definition 1. class template

Template
  
   
Class compare {public: bool IsEqual (T t1, T t2) {return t1 = t2 ;}}; int main () {char str1 [] = "Hello "; char str2 [] = "Hello"; compare
   
    
C1; compare
    
     
C2; cout <c1.IsEqual (1, 1) <endl; // compare two int-type parameters: cout <c2.IsEqual (str1, str2) <endl; // compare two char * type parameters return 0 ;}
    
   
  
2. Function Template
bool IsEqual(T t1, T t2){    return t1 == t2;}int main(){    char str1[] = "Hello";    char str2[] = "Hello";    cout << IsEqual(1, 1) << endl;    cout << IsEqual(str1, str2) << endl;    return 0;}
Ii. Special Template

In the above Code, compare whether the strings are equal. Because the input parameters are of the char * type, the IsEqual function template simply compares the values of the input parameters, that is, whether the two pointers are equal, therefore, the result is false. Obviously, this is inconsistent with our original intention. Therefore, the preceding template requires special processing of the char * type, that is, special.

1. Special Class Template
Template <> // tell the compiler that this is a special template class compare
  
   
// Special (char *) {public: bool IsEqual (char * t1, char * t2) {return strcmp (t1, t2) = 0; // use strcmp to compare strings }};
  

Note: If you are a class-specific external definition member, you cannot add a template <> tag before the member.

In addition, we can only specialize in members rather than special classes. For example, in vector, we can only specialize in push_back operations:

template<>void vector
  
   ::push_back(const char *const &val){    //...}
  

Class Type vector

2. Special Function Template
Template <> bool IsEqual (char * t1, char * t2) // function template specialization {return strcmp (t1, t2) = 0 ;}
Iii. Normalization of templates 1. Normalization of class templates

When there are multiple template parameters, we can only specify a part of them instead of all.

The definition of vector class in the c ++ standard library is an example:

template 
  
   class vector { // … // };template 
   
    class vector
    
      { //…//};
    
   
  

In the preceding example, a parameter is bound to the bool type, and the other parameter is not bound yet, which must be specified by the user.

2. Function template "special"

Strictly speaking, function templates do not support partial features. However, functions can be overloaded to achieve partial features similar to class templates.

template 
  
    void f(T);  (a)
  

Reload (a) according to the overload rule

template < class T> void f(T*);  (b)

If (a) is called the base template, (B) is called the overload of the base template (a), rather than the bitwise of (.

Iv. template specialization Matching 1. class template matching

Optimized is superior to secondary-specific, that is, the most precise matching of template parameters has the highest priority.

Example:

Template
  
   
Class vector {//... //}; // (A) Common template
   
    
Class vector
    
     
{//... ///}; // (B) Special template for pointer type <> class vector
     
      
{//... //}; // (C) Special void *
     
    
   
  

Each type can be used as a common (a) parameter, but only the pointer type can be used as a (B) parameter, and only void * can be used as a (c) parameter.

2. Function template matching

Non-template functions have the highest priority. If no matching non-template function exists, the most matched and exclusive functions have a high priority.

Example:

Template
  
   
Void f (T); // (d) template
   
    
Void f (int, T, double); // (e) template
    
     
Void f (T *); // (f) template <> void f
     
      
(Int); // (g) void f (double); // (h) bool B; int I; double d; f (B ); // call (d) f (I, 42, d) with T = bool // call (e) f (& I) with T = int ); // call (f) f (d) with T = int *; // call (g)
     
    
   
  

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.