C++模板实例掌握

简介: 前段时间重新学习C++,主要看C++编程思想和C++设计新思维。对模版的使用有了更进一层的了解,特总结如下:下面列出了模版的常用情况: //1. 模板类静态成员template  struct testClass {     static int _data; }; template int t...

前段时间重新学习C++,主要看C++编程思想和C++设计新思维。对模版的使用有了更进一层的了解,特总结如下:

下面列出了模版的常用情况:

// 1. 模板类静态成员
template < typename T >   struct testClass
{
   
static int _data;
}
;
template
<>   int testClass < char > ::_data =   1 ;
template
<>   int testClass < long > ::_data =   2 ;
int main( void ) {
    cout
<< boolalpha << (1==testClass<char>::_data) << endl;
    cout
<< boolalpha << (2==testClass<long>::_data) << endl;
}
 

// 2. 模板类偏特化
template < class I, class O >   struct testClass
{
    testClass()
{ cout << "I, O" << endl; } 
}
;
template
< class T >   struct testClass < T * , T *>  
{
    testClass()
{ cout << "T*, T*" << endl; } 
}
;
template
< class T >   struct testClass < const T * , T *>  
{
    testClass()
{ cout << "const T*, T*" << endl; } 
}
;
int main( void )
{
    testClass
<int, char> obj1;
    testClass
<int*, int*> obj2;
    testClass
<const int*, int*> obj3;
}
 

// 3.类模版+函数模版
template < class T >   struct testClass
{
   
void swap( testClass<T>& ) { cout << "swap()" << endl; } 
}
;
template
< class T > inline void swap( testClass < T >& x, testClass < T >& y )
{
    x.swap( y );
}
 
int main( void )
{
    testClass
<int> obj1;
    testClass
<int> obj2;
    swap( obj1, obj2 );
}
 


// 4. 类成员函数模板
struct testClass
{
    template
<class T> void mfun( const T& t )
   
{
        cout
<< t << endl;
    }
 
    template
<class T> operator T()
   
{
       
return T();
    }
 
}
;
int main( void )
{
    testClass obj;
    obj.mfun(
1 );
   
int i = obj;
    cout
<< i << endl;
}
 

// 5. 缺省模板参数推导
template < class T >   struct test
{
    T a;
}
;
template
< class I, class O = test < I >   >   struct testClass
{
    I b;
    O c;
}
;

void main()
{
}



// 6. 非类型模板参数
template < class T, int n >   struct testClass {
    T _t;
    testClass() : _t(n)
{
    }
 
}
;
int main( void ) {
    testClass
<int,1> obj1;
    testClass
<int,2> obj2;
}
 


// 7. 空模板参数
template < class T >   struct testClass;
template
< class T >   bool   operator == ( const testClass < T >& , const testClass < T >& )
{
   
return false;
}
;
template
< class T >   struct testClass
{
    friend
bool operator== <>( const testClass&, const testClass& );
}
;
void main()
{
}


// 8. template template 类
struct Widget1
{
template
<typename T> 
    T foo()
{} 
}
;

template
< template < class T > class X >  
struct Widget2
{
}
;
void main()
{
    cout
<< 3 << '\n';
}




//参考:http://www.cnblogs.com/dayouluo/archive/2005/05/14/155092.html

特别注意:类,全局函数,类的成员函数都可以特化,但是只有类可以半特化,全局函数和类的成员函数不可以半特化。

// -------------------------------------------
// 1 类的特化和类成员函数的特化
template < typename T >
class Widget1
{
public:
   
void Fun1()
   
{
       
//generic implementation
    }

   
}
;

template
<>
class Widget1 < int >
{
public:
   
void Fun1()
   
{
    }

}
;
template
<>  
void Widget1 < char > ::Fun1()
{
   
//specialization
}


void main()
{

  Widget1
<char> w;
  w.Fun1();
  Widget1
<int> w2;
  w2.Fun1();
 
}

// -------------------------------------------
// 2 全局函数的特化和重载
template < typename T1, typename T2 >
T1 Fun2(T2)
{
}


// 下面2个应该是属于重载
template < typename T2 >
char Fun2(T2)
{
   
char c;
   
return c;
}


template
< typename T1 >
T1 Fun2(
char )
{
}


// 全局函数的特化
template <>
char Fun2 < char , int > ( int )
{
   
char c;
   
return c;
}

int main()
{
}

// -------------------------------------------
// 3 全局函数不能半特化,以下编译失败
template < typename T1,typename T2 >   // 原型1
void Test(T1,T2)
{
}


template
< typename T1 >
void Test < T1,T1 > (T1,T1)
{
}


template
< typename T1, typename T2 >   // 原型2
T1 Fun2(T2)
{
}

//
template < typename T2 >
int Fun2 < int ,T2 > (T2)
{
}

template
< typename T1 >
T1 Fun2
< T1, int > ( int )
{
}

template
< typename T >
T Fun2
< T,T > (T)
{
}

int main()
{
}



////-------------------------------------------
////4 类可以特化和半特化,但是特的成员函数像全局函数一样,只能特化,不能半特化,

template < typename T1, typename T2 >   struct Widget2
{
 
void Fun2()
 
{
     
//generic implementation
  }

}
;

template
< typename T2 >  
struct Widget2 < char ,T2 >
{
   
void Fun2()
   
{
    }

}
;

template
< typename T2 >
struct widget2
{
   
void Fun2()
   
{
       
// class partial specialization
    }

}
;



// the class member funtion can not be partial specialization
// 以下的成员函数半特化,编译失败
template < typename T2 >
void Widget2 < char , T2 > ::Fun2()
{
   
//class member function partial specialization
}

int main()
{
}

 

参考:C++编程思想2

http://www.cnblogs.com/feisky/archive/2009/11/04/1596203.html

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
13天前
|
编译器 C++
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
4月前
|
存储 算法 C++
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
148 10
|
6月前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
【C++】——初识模板
|
10天前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
3月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
124 4
|
3月前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
51 3
|
3月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
51 0
|
4月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
37 1
|
4月前
|
存储 编译器 C++
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
【C++篇】引领C++模板初体验:泛型编程的力量与妙用
76 9
|
4月前
|
算法 编译器 C++
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
119 2