• C++仿函数和typename的用法


    1.仿函数的定义是很简单的,就是一个重载了括号()运算符的类,也被称为函数对象。

    主要是用于个性化扩展算法对象。stl中实现了好多算法,每个算法都可以完成日常的大部分工作,设计者还允许你在这些强大的算法上再插上别的功能。

    怎么插?插的比较泛型和object oriented?这就需要直接把你想添加的功能做参数传给算法对象,于是他们就弄出来个函数对象,让你用起来像函数,但插起来像普通的C++类

    比如定义一个仿函数

    template <class T>

    class functor

    {

    T operator()(T x){return x+x;}

    };

    cout<<functor<int>()(2);

    好了这就是仿函数。

    2.typename

    先看问题

    template <class T>

    class Test

    {

    typedef T argument_type;

    }

    template <class T2>

    class Test2

    {

    T2::argument_type*x;

    }

    Test2<Test> obj;

    cout<<obj.x;

    Test2模板类有点特别,它实例化的时候模板参数必须要有argument_type这个成员,而且这个arguement_type也比较特别,它是一个类型定义成员,不是用来运算而是用来定义别的变量。按惯例编译器会把T2::argument_type这种写法当作静态成员处理,但是这里如果按照静态成员去解析一个类型定义显然会报错,而且即使编译器考虑到T2::argument_type有可能是个类型定义,那它也无从追溯,对于模板参数T2及其成员,在Test2实例化之前编译器根本不知道这些信息,除非加typename显式声明。

    另外,让我们再从编译器的角度看待实例化。

    我们认为定义对象是一个实例化的过程,其实编译器得到这样一个指示后并不为对象分配内存,它仍然是为程序的运转做规划,编译后的文件实际上就是一份程序执行方案。何为实例化,答案是we don't care。我们当然是只关注问题的解决,而不是概念本身。

    相信世界是平的
    谨记四个字“修身养性”
    大江东去浪淘尽英雄,再牛B的人物最后也是一掊土
    向善不是目的,而是抚慰心灵,更多的感受幸福,感谢别人给你行善的机会
    相信老子的话:万物生于有,有生于无,一切的道理都源于一个无法证明的假设
    我是好是坏就自然而然的摆在那里,并不会因为别人的评价而改变什么,我也不需要别人用一张纸来说明我什么,世间最难得的是自由



    支持大额赞助:
  • 相关阅读:
    linux各文件夹的作用
    CodeIgniter的URL传过来的中文参数处理错误的修复
    syn_ack攻击
    分治排序
    Linux Shell学习笔记
    sql题型
    jquery ajax
    json 字符串与对象之间的转换
    常用的VIM命令列表 移动光标
    visual c++ 2012 内存泄漏检测方法
  • 原文地址:https://www.cnblogs.com/sky-view/p/3246652.html
Copyright © 2020-2023  润新知