成員模板(member template) 既可以在普通類(ordinary class), 也可以在類模板(class template);
在普通類中, 在使用成員函數時, 不用提供模板參數, 函數可以根據使用的參數,
自動推導(deduce)模板實參(template argument)對應模板形參(template parameter);
在類模板中, 成員函數的模板參數(template parameter)可以和類的模板參數不同, 但在定義(definition)中,
必須添加兩個模板參數列表(template parameter list), 第一個為類的, 第二個為成員函數的;
代碼如下:
/*
* cppprimer.cpp
*
* Created on: 2013.11.24
* Author: Caroline
*/
/*eclipse cdt, gcc 4.8.1*/
#include <iostream>
#include <functional>
#include <memory>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <iterator>
//函數模板默認參數
template <typename T, typename F = std::less<T>>
int compare (const T &v1, const T &v2, F f = F())
{
if (f(v1, v2)) return -1;
if (f(v2, v1)) return 1;
return 0;
}
class DebugDelete {
public:
DebugDelete (std::ostream &s = std::cerr) : os (s) { }
template <typename T> void operator() (T *p) const {
os << "deleting unique_ptr" << std::endl; delete p;
}
private:
std::ostream &os;
};
template <typename T> class Blob {
public:
template <typename It> Blob (It b, It e);
/*template <typename It> Blob (It b, It e) {
std::sort(b, e);
}*/
};
template <typename T>
template <typename It>
Blob<T>::Blob (It b, It e) {
std::sort(b, e); //容器需要允許被排序
}
int main (void) {
std::cout << "compare (0, 42) = " << compare (0, 42) << std::endl;
double* p = new double;
DebugDelete d;
d(p); //使用時, 可以自動推倒模板
int* ip = new int;
DebugDelete() (ip);
std::unique_ptr<int, DebugDelete> pi (new int, DebugDelete());
std::unique_ptr<std::string, DebugDelete> ps (new std::string, DebugDelete());
int ia[] = {9, 8, 7, 6, 5};
std::vector<long> vi = {5, 4, 3, 2, 1, 0};
std::deque<std::string> w = {"lady", "girl", "woman", "now"};
Blob<int> a1(std::begin(ia), std::end(ia));
Blob<int> a2(vi.begin(), vi.end());
Blob<std::string> a3(w.begin(), w.end());
std::cout << "int ia[] = ";
for (const auto i : ia) { std::cout << i << " "; }
std::cout << std::endl;
std::cout << "std::vector<long> vi = ";
for (const auto i : vi) { std::cout << i << " "; }
std::cout << std::endl;
std::cout << "std::list<const char*> w = ";
for (const auto i : w) { std::cout << i << " "; }
std::cout << std::endl;
return 0;
}
輸出:
deleting unique_ptr deleting unique_ptr deleting unique_ptr deleting unique_ptr compare (0, 42) = -1 int ia[] = 5 6 7 8 9 std::vector<long> vi = 0 1 2 3 4 5 std::list<const char*> w = girl lady now woman
作者:csdn博客 Spike_King