C++类型支持之std::is_function

2023-11-06

std::is_function(C++11)用于检查类型是否为函数,注意此处函数类型包括std::function, lambda, 有重载operator()的类。

可能的实现:

// 初等模板
template<class>
struct is_function : std::false_type { };

// 对常规函数的特化
template<class Fn, class... Args>
struct is_function<Fn(Args...)> : std::true_type {};

// 对变参数函数,如 std::printf 的特化
template<class Fn, class... Args>
struct is_function<Fn(Args......)> : std::true_type {};

// 对拥有 cv 限定符的函数类型的特化
template<class Fn, class... Args>
struct is_function<Fn(Args...) const> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) volatile> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) const volatile> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) volatile> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const volatile> : std::true_type {};

// 对拥有引用限定符的函数类型的特化
template<class Fn, class... Args>
struct is_function<Fn(Args...) &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) const &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) volatile &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) const volatile &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) volatile &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const volatile &> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) && > : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) const &&> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) volatile &&> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args...) const volatile &&> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) && > : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const &&> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) volatile &&> : std::true_type {};
template<class Fn, class... Args>
struct is_function<Fn(Args......) const volatile &&> : std::true_type {};

实例:

class A
{
private:
    void operator() (int) {}
};

class B
{
public:
    void(*func(char)) (int) {}
};

class C
{
public:
    void func1() {}
    static void func2() {}
};

template<typename>
struct PM_traits {};

template<class T, class U>
struct PM_traits<U T::*> {
    using member_func = U;
};

int func1() { return 0; }           // general function

int main()
{
    {
        int(*func2)() = func1;      // method pointer
        int(*func3(int))(char);     // method to return a method pointer

        static_assert(std::is_function<int(char)>::value, "");              // true
        static_assert(std::is_function<decltype(func1)>::value, "");        // true
        static_assert(!std::is_function<decltype(func2)>::value, "");       // false
        static_assert(!std::is_function<decltype(func3(0))>::value, "");    // false
    }

    {
        static_assert(!std::is_function<A>::value, "");                     // false
        B b;
        static_assert(!std::is_function<decltype(b.func('a'))>::value, ""); // false
        C c;
        static_assert(!std::is_function<decltype(&c.func1)>::value, "");    // false
        static_assert(std::is_function<decltype(C::func2)>::value, "");     // true
        static_assert(std::is_function<PM_traits<decltype(&C::func1)>::member_func>::value, "");    // true
        static_assert(!std::is_function < decltype(std::mem_fn(&C::func1))>::value, "");    //false
    }

    {
        auto lambda = [](int) {};
        static_assert(!std::is_function <decltype(lambda)> ::value, "");    // false
    }

    {
        static_assert(!std::is_function <std::function<int()>> ::value, "");// false
    }

    system("PAUSE");
}

从实例可以看出仅有普通函数和类中静态函数被认为是函数类型,比较特殊的是通过模板萃取出成员函数类型也可以是函数类型,但是通过std::mem_fun得到的并不认为是函数类型,是一个函数指针。

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

C++类型支持之std::is_function 的相关文章

  • 2018-2019-2 网络对抗技术 20165335 Exp2 后门原理与实践

    一 基础问题回答 1 例举你能想到的一个后门进入到你系统中的可能方式 钓鱼网站 搞一个假网站 假淘宝 盗版电影 文库下载文档什么的 下载东西的时候把带隐藏的后门程序附带下载进去 自启动 反弹连接 搞一个小网站 用iframe标签跳转到危险网
  • 自动化测试工具Parasoft c++ test v2021.1全新发布,简化嵌入式测试

    随着Parasoft C C test 2021 1的发布 嵌入式测试和开发团队获得了现代高度自动化CI CD管道的速度和效率 最新版本为团队提供了完全集成的静态和单元测试 以实现持续合规性和质量的交付 新版本继续全面支持最新的合规标准 包
  • 几种查找的时间复杂度

    1 顺序查找 1 最好情况 要查找的第一个就是 时间复杂度为 O 1 2 最坏情况 最后一个是要查找的元素 时间复杂度未 O n 3 平均情况下就是 n 1 2 所以总的来说时间复杂度为 O n 2 二分查找 O log2n gt log以
  • 在Ubuntu上编译安装LLVM

    章节索引 Motivation 环境 Git 下载LLVM源码 CMake 编译 安装 文件链接 验证 后记 Motivation 两周前实验室要求我配置一个叫Speedy js的编译器 配置这个编译器需要先配置好LLVM 根据这个编译器作
  • Unity 流程控制

    异步函数 Invoke 被调用的方法不是立刻执行 而是过一段时间后才执行 注 Invoke是不能接受有参数的方法的 Invoke是受Time timeScale的影响 所以当Time timeScale 0 的时候 Invoke是无效的 因
  • python测试url是否可访问,网站是否连通的方法

    目录 前言 1 requests库 1 1 传参 1 2 响应内容 2 python web 前言 一般这种方法用在校验 比如 前端界面传回后端的url 如果返回值不是200 不保存其值 调用的接口不通 直接返回非200 爬虫网站 验证ur
  • C# Dictionary用法总结

    1 常规用法 增加键值对之前需要判断是否存在该键 如果已经存在该键而且不判断 将抛出异常 所以这样每次都要进行判断 很麻烦 在备注里使用了一个扩展方法 public static void DicSample1 Dictionary
  • 【今日CV 计算机视觉论文速览 第111期】Fri, 3 May 2019

    今日CS CV 计算机视觉论文速览 Fri 3 May 2019 Totally 29 papers 上期速览 更多精彩请移步主页 Interesting Single Image Portrait Relighting单图肖像光照重建 本
  • 【Java基础】使用HashMap和For循环查找数据并且统计耗费时长

    准备一个ArrayList其中存放3000000 三百万个 Hero对象 其名称是随机的 格式是hero 4位随机数 hero 3229 hero 6232 hero 9365 因为总数很大 所以几乎每种都有重复 把名字叫做 hero 55
  • ICS大作业--hello程序人生

    摘 要 Hello是每个程序员第一个接触的程序 在本文中利用计算机系统所学的知识 基于Linux平台 通过gcc objdump gdb edb等工具 从c源程序的预处理开始 跟踪分析程序编译 汇编 链接 进程管理 存储管理 I O管理整个
  • 基于Matlab的激光雷达与单目摄像头联合外参标定

    1 背景介绍 目前团队正在与某主机厂合作开发L4级自动驾驶出租车项目 所用的传感器包括80线激光雷达和单目摄像头 为了充分利用Lidar和Cam各自的优势 设计了一种融合算法 需要获得Lidar2Camera的联合外参 前期使用Autowa
  • Java数组&二维数组

    Java数组 二维数组 1 一维数组 1 1 数组介绍 数组就是存储数据长度固定的容器 存储多个数据的数据类型要一致 1 2 数组的定义格式 1 2 1 第一种格式 数据类型 数组名 示例 int arr double arr char a
  • python调用多级目录中的文件_python复制多层目录下的文件至其他盘符对应的目录中...

    tmp c cmd js d TZT2 0 js d TZT js d TZT 346 226 207 346 241 243 350 257 264 346 230 216 json d c modules config js d css
  • Go_包、工程管理

    包 包其实就是文件夹 把文件分类放到不同的包利于管理 作用 如果把所有的代码都放在一个文件中 后续的可维护性 阅读性都比较差 所以可以使用包的来区分不同的模块 功能分别放在不同包中 然后其它的文件使用到功能就调用就可以了 在同一个包下是函数
  • android studio在XML预览中出现Rendering Problems问题

    http blog csdn net u014365838 article details 52078501 如图所示 出现问题的原因是style不和规范 虽然没有大问题 编译也可以通过 不过总有些碍眼 解决方法 1 在styles xml
  • apache-ant build.xml 实例

    文章目录 version apache ant 1 9 15 build xml
  • php发送邮件样式_php简单实现发送带附件的邮件

    这篇文章主要介绍了php简单实现发送带附件的邮件 涉及附件上传及邮件发送的相关技巧 需要的朋友可以参考下 本文实例讲述了php简单实现发送带附件的邮件 分享给大家供大家参考 具体如下 下面是静态html代码 带附件的邮件发送 发送人 收件人
  • 多gpu训练梯度如何计算,求和是否要求平均

    作者 智星云服务 链接 https www zhihu com question 271226455 answer 1521784627 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 作者 itsAndy
  • libc.so.6

    libc so 6是一个类似于WINDOWS下的一个快捷指向型的文件 用命令LN产生 ln s root arm unknown linux gnu arm unknown linux gnu lib libc so root worksp

随机推荐

  • uni-app生产环境去掉console

    uni app生产环境去掉console 运行期判断 运行期判断是指代码已经打入包中 仍然需要在运行期判断平台 此时可使用 uni getSystemInfoSync platform 判断客户端环境是 Android iOS 还是小程序开
  • kubernetes安全检测工具-kube-bench

    一 kube bench基础介绍 kube bench是基于go语言开发 一款针对kubernetes进行安全检测的工具 主要是检测kubernetes集群的各个组件的配置 确认配置文件是否符合安全基线标准 输出检测报告 并给出修复建议 从
  • 蓝桥杯 算法训练 拿金币 Java

    import java util Scanner public class Main public static void main String args Scanner scanner new Scanner System in int
  • 第十二届蓝桥杯javaB组刷题day2

    1 直线 我们思路 暴力解法 将所有可能的情况列举出来 故需要两个坐标的横纵坐标 便需要四个for循环来进行遍历 出现问题 需要排除斜率为0的情况 后面再单独进行相加 因为需要set来加入斜率 而一条斜线y kx b 包括k和b set只能
  • Linux ceontOS7.X 安装RabbitMQ

    安装erlang环境 https blog csdn net qq 37279783 article details 90515409 下载 解压MQ 下载 https www rabbitmq com releases rabbitmq
  • 测试用例设计方法---等价类划分法

    1 等价类划分法 1 1 定义 是把所有可能输入的数据 即程序的输入域划分策划国内若干部分 子集 然后从每一个子集中选取少数具有代表性的数据作为测试用例 方法是一种重要的 常用的黑盒测试用例设计方法 1 1划分等价类 1 有效等价类 指对于
  • 大师兄!SLAM 为什么需要李群与李代数?

    from https mp weixin qq com s sVjy9kr 8qc9W9VN78JoDQ 作者 electech6 来源 计算机视觉life 编辑 Tony 很多刚刚接触SLAM的小伙伴在看到李群和李代数这部分的时候 都有点
  • 编译原理第二版4.4答案

    4 4 节的练习 4 4 1 为下面的每个文法设计一个预测分析器 并给出预测分析表 你可能先要对文法进行提取左公因子或者消除左递归的操作 练习 4 2 2 中 1 7 中的文法 解答 S gt 0 S 1 0 1 step1 提取左公因子
  • [1182]clickhouse的日期函数

    文章目录 时间获取 时间转换 时间计算 时间格式化 时间获取 获取当前时间戳 select toUnixTimestamp now 获取指定时间的时间戳 select toUnixTimestamp 2021 05 11 14 37 37
  • Java线程:并发协作-死锁

    本文转载至 http lavasoft blog 51cto com 62575 222074 Java线程 并发协作 死锁 线程发生死锁可能性很小 即使看似可能发生死锁的代码 在运行时发生死锁的可能性也是小之又小 发生死锁的原因一般是两个
  • 【系列 2】手写vue模板编译

    模板编译流程是什么 1 获取 outerHTML div name div 2 正则查找转义成 ast 语法树 ast tag div attrs name id value app children type 3 text name pa
  • Java 上传附件后端接口大体流程和逻辑

    Java 上传附件 后端接口大体逻辑 所谓的附件 即包括我们常见的图片 各类文档 压缩包等等 上传附件是我们日常开发过程中 经常遇到的一个场景 也是我们Java后端程序猿必须要会的 今天周五 事情做完 离下班还有点时间 来水水大体思路 本文
  • CSS——文字对齐方式

    横向对齐 方法1 单行块级元素水平居中只用添加text align即可 如P标签 垂直居中vertical align只适用于行内元素与单元格 所以设置行高与块高度相同即可 text align center 方法2 普通的文本居中只要设置
  • 【OpenCV3图像处理】Mat类详解 之 元素的获取与赋值 ( 对比.at<>()函数 和 .ptr<>()函数)

    Mat中像素的获取与赋值 计算机视觉中 图像的读取是图像处理的基础 图像就是一系列像素值 OpenCV使用数据结构cv Mat来存储图像 cv Mat是一个矩阵类 矩阵中每一个元素都代表一个像素 对于灰度图像 像素用8位无符号数 0表示黑色
  • Android 开发 改变某个Activity的系统字号

    Android系统的字号可以在设置里改变 常常会影响布局效果 如果是个别控件不想被改变大小 使用 dp 而非 sp 作为字体单位即可 转载请注明出处 http blog csdn net u013258802 article details
  • JDBC连接MySQL数据库及自定义JDBCUtils

    JDBC连接MySQL数据库及自定义JDBCUtils 前言 一 JDBC连接数据库 1 引入依赖 2 连接数据库 二 自定义JDBCUtils 1 JDBCUtils 2 BeanJDBCUtils 3 使用自定义JDBC类操作数据库 前
  • Docker练习

  • 数据挖掘(二):特征工程

    数据挖掘 二 特征工程 1 删除无关变量 2 数据类型分析 3 缺失值处理 4 变量筛选 5 模型训练和评估 导入包 import pandas as pd import numpy as np from scipy import stat
  • Elasticsearch 快速开始

    Elasticsearch 是一个分布式的 RESTful 风格的搜索和数据分析引擎 查询 Elasticsearch 允许执行和合并多种类型的搜索 结构化 非结构化 地理位置 度量指标 搜索方式随心而变 分析 找到与查询最匹配的十个文档是
  • C++类型支持之std::is_function

    std is function C 11 用于检查类型是否为函数 注意此处函数类型不包括std function lambda 有重载operator 的类 可能的实现 初等模板 template