zoukankan      html  css  js  c++  java
  • 20120906

     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<N>::*p) 是函数名, (typename X<N>::I>)是函数的参数,对应第4行的定义 X<N>::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 ();                          //错误,模版参数无法根据缺省值演绎
  • 相关阅读:
    26.列表的循环遍历
    效率比较--链表
    心之距离 再回首 光年之遥远
    效率比较--集合
    效率比较--数组
    哈希表
    栈 VS 队列
    struts1 标签引入
    web 连接池配置
    zip&ftp命令
  • 原文地址:https://www.cnblogs.com/fanqs/p/2673837.html
Copyright © 2011-2022 走看看