2012-09-06
5455 ワード
1 template <int N>
2 class X {
3 public:
4 typedef int I;
5 void f(int) {
6 std::cout << "f!" << std::endl;
7 }
8 };
9
10 template <int N>
11 void fppm (void (X<N>::*p)(typename X<N>::I) ); //
12
13 int main() {
14 fppm(&X<33>::f);
15 }
上の11行目の呼び出しでは、fppmのパラメータは関数です.voidは戻り値、(X
従って、11行に対してvoid fppm(void f(int))に相当する
1 template <typename T>
2 void f(T){
3 std::cout << "T" << std::endl;
4 }
5 template<>
6 void f(double) {
7 std::cout << "double" << std::endl;
8 };
9
10 void (*df) (double) = &f; // double f
11
12 df(111); // double
13 df('a'); // double
14 df(2.33); // double
テンプレートの実パラメトリック演繹は、関数テンプレートとメンバー関数テンプレートにのみ適用され、クラステンプレートには適用されません.クラステンプレートの構造関数についても,実パラメータに基づいてクラステンプレートパラメータを演繹することはできない.手動でしか指定できません.
関数テンプレートでは、デフォルトの関数呼び出し実パラメータを指定できますが、デフォルトの実パラメータに基づいてテンプレートパラメータを演繹することはできません.
template<typename T>
void init(T* loc, T const& val = T() ){
*loc = val;
}
init(12, 13); // ,
init(12); // , ,
template<typename T>
void f (T x = 11){
}
f<int> (); // int, x=11
f (); // ,