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:*p)は関数名、(typename X::I>)は関数のパラメータであり、4行目の定義X::Iはここでintを表す
従って、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 ();                          //