函式模板引數推導的兩個經典應用
阿新 • • 發佈:2019-01-26
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);
l 首先,陣列的長度是一個編譯期常量,可特化模板引數bound;
l 其次,陣列型別已知,可特化模板引數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();
l 函式模板可以推導引數型別;
l 根據此型別可設定類模板的引數型別。
該技術大量應用於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...