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 ();                          //错误,模版参数无法根据缺省值演绎
  • 相关阅读:
    qt捕鱼达人
    linux通过源码安装gdb
    打造简易http服务器
    linux缓存同步
    NOI之后的碎碎念
    Validate至少有一个不能为空
    IOI 2020 集训队作业
    P6033 [NOIP2004 提高组] 合并果子 加强版 题解
    P3017 [USACO11MAR]Brownie Slicing G 题解
    LOJ #145. DFS 序 2 题解
  • 原文地址:https://www.cnblogs.com/fanqs/p/2673837.html
Copyright © 2011-2022 走看看