• 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 ();                          //错误,模版参数无法根据缺省值演绎
  • 相关阅读:
    XMPP协议之消息回执解决方案
    使用js在网页上记录鼠标划圈的小程序
    数据库SQL,NoSQL之小感悟
    MongoDB安装与使用体验
    缓存遇到的数据过滤与分页问题
    Tomcat shutdown执行后无法退出进程问题排查及解决
    Apache Ignite之集群应用测试
    Ignite性能测试以及对redis的对比
    学习AOP之深入一点Spring Aop
    学习AOP之认识一下Spring AOP
  • 原文地址:https://www.cnblogs.com/fanqs/p/2673837.html
Copyright © 2020-2023  润新知