STL(标准模板库)中class并不一定是“类”

2023-05-16

 

在模板库里面,可谓“处处 皆模板”,当然了不是模板就不叫模板库了,但是有一点经常让人忽视,使用模板时候,类就真的时候类?也就是说class就真的是类?答案是否定的!

我们看一段代码:

 

# include <stdio.h>

typedef int D(int x);

template 
< class  T,  class  R >
R getmy(R x, T 
* f);

template 
< class  T,  class  R >
R getmy1(R x, T f);

D my;

int main() {
    printf(
" x = %d " , getmy( 10 , my) );
    printf(
" x = %d " , getmy1( 10 , my) );
    
return   1 ;
}

template 
< class  T,  class  R >
R getmy(R x, T 
* f) {
    (
* f)(x);
    
return  f(x);
}

template 
< class  T,  class  R >
R getmy1(R x, T f) {
    
return  f(x);
}

int my (int x) {
    
return  x;
}

 

从上面的getmy函数和getmy1函数就可以看出,里面的class T就不是“类”,仅仅是一个函数,当然了更多情况下我们使用类,这也是很多觉得不要用class标记,而是使用typename标记。

当传入my函数的时候,T类型就自然解释成了D!函数的按地址调用这里就不说了。

回到STL,我们再看标准模板库里面的一个函数:find_if(....)

template < class  _InIt,
    
class  _Pr >  inline
    _InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {    
//  find first satisfying _Pred
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Pred);
    
for  (; _First  !=  _Last;  ++ _First)
        
if  (_Pred( * _First))
            
break ;
    
return  (_First);
    }

template
< class  _InIt,
    
class  _Pr >  inline
    _InIt find_if(_InIt _First, _InIt _Last, _Pr _Pred)
    {    
//  find first satisfying _Pred
    _ASSIGN_FROM_BASE(_First,
        _Find_if(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Pred));
    
return  (_First);
    }

 

在find_if的定义里面,第三个参数,被假定为谓词,返回一个bool类型,这里定义是

class _Pr 类型的_Pred变量。

事实上,在stl的设计时候,一般的假定这个变量是一个类对象,可以作为函数对象,或者说拟函数对象,候捷同志(“台湾人我们就称呼为同志吧”)在stl源码剖析一书里面说这个也叫仿函数。

事实不然,他主要接受拟函数对象,但是他肯定是接受常规函数的,只是要保持参数个数、类型以及其返回类型而已。

在《c++程序设计语言》一书的455页就有这么一个函数:

bool less_than_7 (int v) {
    
return  v  <   7 ;
}

void f(std::list
< int >   & c) {
    std::list
< int > ::iterator p  =  find_if(c.begin(), c.end(), less_than_7);
    
// ……
}

在编译器解释find_if()定义的时候,就把上面的_Pred解释成了一个常规函数,而不是一个类对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL(标准模板库)中class并不一定是“类” 的相关文章

随机推荐

  • Mark:UFLDL反向传播算法及其检验调试方法——适合自己的才是好的

    人工智能 机器学习泛滥 以前搜不出来 xff0c 现在搜出来的太多 找自己想看的都得费半天劲 这当然是好的 xff0c 有资料总比没有强 但是搞这个方向 xff0c 适合自己的才是好材料 太简单 xff0c 你觉得不过瘾 xff0c 太深奥
  • torch.utils.data.dataloader参数collate_fn简析

    torch utils data DataLoader是pytorch提供的数据加载类 xff0c 初始化函数如下 xff0c torch utils data DataLoader dataset batch size 61 1 shuf
  • 软件工程—— 学校人力资源管理系统说明

    课程设计内容 1 设计目的 人力资源管理系统 是事业单位最基本的人事管理系统 用户可以通过该系统 xff0c 管理事业单位内部职工的档案 进行人事考勤 xff0c 准确无误地记录职工的出勤情况 xff1b 全自动生成职工的工资表 xff0c
  • 梯度下降方法中的学习率(learning rate), 衰减因子(decay) 冲量(momentum)

    本文总结自如下两个链接的内容 xff0c 建议读者直接阅读链接中的文章 1 https www jianshu com p 58b3fe300ecb 2 https www jianshu com p d8222a84613c 学习率 学习
  • Linux下Python 缩进 SyntaxError: 'break' outside loop

    这段代码将会报错 xff0c SyntaxError 39 break 39 outside loop 因为Python要求严格缩进 xff0c while循环的内容所有都必须缩进一空格 while循环体覆盖了剩下所有代码 因为if els
  • Linux ZRAM的简单介绍

    1 概念 zram 又称内存压缩 xff0c Linux kernel会把不常用的内存进行压缩 xff0c 以换出更多的内存供系统使用 平时空闲时候会做压缩 xff0c 以备不时之需 kernel 申请不到内存 xff0c 会触发压缩机制
  • 07 - 如何查看镜像及MySQL各环境参数的说明(Docker系列)

    本文章来自 知识林 在 06 分析docker run hello world xff08 Docker系列 xff09 一文中看到了docker run hello world xff0c 也描述了hello world是镜像名称 xff
  • Bootloader 相关概念理解及测试用例设计

    一 什么是Bootloader 单看单词 xff1a boot v 启动 xff1b loader n 装货设备 xff0c bootloader存在的意义就是指更新App程序 xff0c 以下简称bl 在14229规范中的Boot Sof
  • PixHawk飞控 配置参数

    PixHawk飞控 PixHawk是著名飞控厂商3DR推出的新一代独立 开源 高效的飞行控制器 xff0c 前身为APM飞控 xff0c 不仅提供了丰富的外设模块和可靠的飞行体验 xff0c 有能力的爱好者还可在其基础上进行二次开发 第一次
  • strcat函数--字符串连接函数

    strcat是STRing CATenate 字符串连接 xff09 的缩写 xff0c 调用strcat函数首先要有 lt string h gt 这个头文件 xff0c 它的作用是把两个字符数组中的字符串连接起来 xff0c 把字符串2
  • 最新使用深度相机D435i运行Vins-fusion并建立octomap八叉树栅格地图

    目录 一 xff0c 软件安装 二 xff0c 配置参数 三 xff0c 使用Vins fusion建立Octomap 四 xff0c 使用 DenseSurfelMapping建立Octomap 先决条件 Ubuntu 64 bit 16
  • 2022-10-13 js中数组删除对象

    JavaScript splice 方法 说明 xff1a splice 方法可删除从 index 处开始的零个或多个元素 xff0c 并且用参数列表中声明的一个或多个值来替换那些被删除的元素 数组 splice 数组索引下标 个数len
  • mmcv 报错undefined symbol: _ZNK2at6Tensor7is_cudaEv

    gt gt gt from mmcv ops import nms Traceback most recent call last File 34 lt stdin gt 34 line 1 in lt module gt File 34
  • 学校人力资源管理系统可行性分析

    学校人力资源管理系统可行性分析 一 技术可行性 硬件实施的可行性 xff0c 学校电脑配置相对较高 xff0c 可满足信息系统运行的需要 xff1b 学校可以采用常用的数据库应用程序开发工具实现学校内部的业务管理是完全可行的 xff0c 不
  • Jetson TX2 刷机教程(JetPack4.2版本)

    自从NVIDIA出现JetPack4 2 Ubuntu18 04 版本之后 xff0c 安装方式和之前就大不相同 xff0c 看了前面的几个安装版本之后 xff0c 感觉新版的好像安装起来更加简洁了 xff0c 只需要一个SDK就可以 xf
  • FactSystem设计思路

    Fact System 模块设计思路与学习总结 组成结构 FactSystem xff08 事件系统 参数系统 xff09 FactControls xff08 事件控制 xff09 FactPanelController xff08 事件
  • GPS设计思路

    GPS模块设计思路与学习总结 1 组成结构 Drivers src xff08 驱动程序资源包 xff09 gps helper xff08 GPS助手 xff09 ubx xff08 UBX协议 xff09 RTCM RTCMMavlin
  • ipv4和ipv6的区别

    ipv4 和ipv6 的区别本质在于它们的二进制表示位数 xff0c ipv4是用32位0 1序列来表示的 xff0c 而ipv6使用128位0 1序列来表示的 ipv4用32位 xff0c 为了方便人类记录和阅读 xff0c 我们通常将i
  • PHP字符串函数strrev(反转字符串)

    在PHP中 xff0c 字符串函数 strrev 用来反转字符串 函数语法 xff1a strrev string string string 函数参数说明 xff1a 参数描述string必需 规定要反转的字符串 strrev 用来反转字
  • STL(标准模板库)中class并不一定是“类”

    在模板库里面 xff0c 可谓 处处 皆模板 xff0c 当然了不是模板就不叫模板库了 xff0c 但是有一点经常让人忽视 xff0c 使用模板时候 xff0c 类就真的时候类 xff1f 也就是说class就真的是类 xff1f 答案是否