1. 程式人生 > >函式模板引數推導的兩個經典應用

函式模板引數推導的兩個經典應用

1.推導陣列引數。【可以分別推匯出“元素型別”和“陣列長度”】 // 模板函式定義 template<int bound, typename T> void f1( T (&ary)[bound] ) {      T x;      for(int i=0; i<bound; i++ )      {          x = ary[i];      } } // 帶有陣列引數的函式模板的使用      int a[] = {1,2,3,4,5,6};      f1(a); 首先,陣列的長度是一個編譯期常量,可特化模板引數bound; 其次,陣列型別已知,可特化模板引數T。 利用這個特性,在給函式傳遞陣列引數時,可以避免多傳一個數組長度的引數。 2.
類模板引數的隱式推導。【目標是用模板函式建立一個類物件,其間可根據函式的引數型別設定類模板的引數型別。】 // 定義 template<typename T> class A { public:  A(T a){}  void fun(){} }; template<typename T> A<T> makefun( T x) {  return A<T>(x); } //使用 makefun( 1 ).fun(); 函式模板可以推導引數型別; 根據此型別可設定類模板的引數型別。 該技術大量應用於STL的函式物件的建立。例如: template <typename A1, typename A2, typename R>
class PFun2 : public std::binary_function<A1,A2,R> {  public:     explicit PFun2( R (*fp)(A1,A2) ) : fp_( fp ) {}     R operator()( A1 a1, A2 a2 ) const         { return fp_( a1, a2 ); }  private:     R (*fp_)(A1,A2); }; template <typename R, typename A1, typename A2>
inline PFun2<A1,A2,R> makePFun( R (*pf)(A1,A2) )
    { return PFun2<A1,A2,R>(pf); }
//...
std::sort(b, e, makePFun(isGreater)); // much better...