c++20 concept

2023-05-16

Visual Studio 2019今天发布了16.3版本更新,加入了C++20的concept支持,在此记录一下concept的用法:

concept示例

1.限制只能打印int类型

//std::enable_if实现
template <typename T>
void print_int(std::enable_if_t<std::is_same_v<int, std::decay_t<T>>, T> v)
{
	std::cout << v << std::endl;
}

int main()
{
	print_int(1);			//error C2783: “void print_int(enable_if<std::is_same_v<int,decay<_Ty>::type>,T>::type)”: 未能为“T”推导 模板 参数
	print_int<int>(1);
	print_int<double>(1.0); //error C2672: “print_int”: 未找到匹配的重载函数
}
//concept实现
template <class T>
concept IntLimit = std::is_same_v<int, std::decay_t<T>>; //制约T塌陷后的类型必须与int相同

template <IntLimit T>
void print_int(T v)
{
	std::cout << v << std::endl;
}

int main()
{
	print_int(1);
	print_int(1.0); //error C2672: “print_int”: 未找到匹配的重载函数
}

可以看到concept比之前的实现更加简洁易懂。
2.require关键字

//限定只能调用存在name成员函数的类
class A
{
public:
	std::string_view name() const { return "A"; }
};

class B
{
public:
	std::string_view class_name() const { return "B"; }
};

template <typename T>
concept NameLimit = requires(T a)
{
	a.name();	//制约T的实例a必须要有name成员函数
};

template <NameLimit T>
void print_name(T a)
{
	std::cout << a.name() << std::endl;
}

int main()
{
	A a;
	B b;
	print_name(a);
	print_name(b); //error C2672 : “print_name”: 未找到匹配的重载函数
}
//限定只能调用返回值可以转换为std::string的函数
template <typename T>
concept ReturnLimit = requires(T t)
{
	{t()} -> std::convertible_to<std::string> ;	//函数返回值必须可以转换为std::string
	std::is_function<T>;						//T必须为函数
};

template <ReturnLimit T>
void print_string(T func)
{
	std::cout << func() << std::endl;
}

std::string str1()
{
	return "123";
}

constexpr const char* str2()
{
	return "str2";
}

std::basic_string<char8_t> str3()
{
	return u8"str3";
}

int main()
{
	std::string t;
	t = std::string_view("213");
	print_string(&str1);
	print_string(&str2);
	print_string(&str3); //error C2672: “print_string”: 未找到匹配的重载函数
	return 0;
}

concept可以和if constexpr结合使用

class A
{
public:
	constexpr std::string_view name() const { return "A"; }
};

class B
{
public:
	constexpr std::string_view class_name() const { return "B"; }
};

template <typename T>
concept CA = requires(T a)
{
	a.name();
};

template <typename T>
concept CB = requires(T b)
{
	b.class_name();
};

template <typename T>
void print_class(const T& t)
{
	if constexpr (CA<T>)
	{
		std::cout << t.name() << std::endl;
	}
	else if constexpr (CB<T>)
		std::cout << t.class_name() << std::endl;
}

int main()
{
	A a;
	B b;
	print_class(a);
	print_class(b);
	return 0;
}

打印出结果:
A
B

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

c++20 concept 的相关文章

  • AM5728(AM5708)开发实战之使能u-boot看门狗

    一 看门狗介绍 为了使嵌入式系统能够在异常情况下自动复位 xff0c 一般需要引入看门狗 看门狗可以分为如下几类 xff1a 1 CPU自带的看门狗模块 优点 xff1a 可以灵活配置溢出时间 xff0c 可以随时禁用 缺点 xff1a 需
  • AM5728(AM5708)开发实战之调试DP83822 LED

    一 LED寄存器分析 MLEDCR即Multi LED Control Register 地址为0x0025 MLEDCR 1 0 设置MLED路由功能 具体如下所示 0x00表示MLED功能路由到COL PIN29 0x03表示MLED功
  • AM5728(AM5708)开发实战之移植OpenCV-3.4.11

    一 概述 OpenCV是一个开源的跨平台计算机视觉库 xff0c 可以运行在Linux Windows Mac OS等操作系统上 xff0c 它为图像处理 模式识别 三维重建 物体跟踪 机器学习提供了丰富的算法 由于OpenCV依赖包特别多
  • 国外大神深度评测Firefly-RK3399 Android8.1固件

    国外大神深度评测Firefly RK3399 Android8 1固件 Review of Firefly RK3399 Board with Android 8 1 Firmware 内容详细介绍了组装Firefly RK3399 xff

随机推荐

  • 设备树之I2C和SPI实例

    I2C实例 clock frequency i2c总线频率 xff0c 常用值有100000 xff0c 400000 address cells 该属性值必须为1 size cells 该属性值必须为0 i2c具体实例如下图所示 xff1
  • 设备树之GPIO和中断实例

    概述 设备树不仅仅描述常规硬件信息 xff0c 还可以描述中断 xff0c GPIO xff0c DMA xff0c PINCTRL xff0c 时钟 xff0c 电源管理等内核基础设施信息及其使用情况 xff0c 下面重点介绍中断 xff
  • 设备树之HDMI输出实例

    一 HDMI输出实例详解 图1 图2 图3 图1 xff0c 图2和图3构成了一个典型的HDMI输出链路 图1 xff1a HDMI接口设备结点 xff0c 该HDMI接口使用TYPE A接口 注意 xff1a HDMI接口结点名称为con
  • 设备树之MMC总线实例

    MMC总线重要属性 address cells 61 lt 1 gt 该属性值必须为1 size cells 61 lt 0 gt 该属性值必须为0 max frequency mmc总线最大时钟频率 bus width mmc总线位宽 x
  • Coursera计算概论A(李戈)教授课程

    昨天 xff08 4月29日 xff09 结束了 计算概论A的课程 xff0c 我对C语言有了更多的了解 这部课程算是我踏入程序设计领域的一个敲门砖吧 对C程序语言的理解 xff1a C语言简单 高效 易懂 xff0c 重点在于 1 结构
  • linux 命令行报bash command not found的解决办法

    命令行报bash command not found的解决办法 xff08 几乎所有命令 xff09 命令行输入命令执行后报 bash command not found 这是由于 系统PATH设置问题 xff0c PATH没有设置对 xf
  • cprintf函数调用到屏幕(cga)输出流程分析

    本文所有代码均为JOS内核源代码 xff0c 可以从MIT 6 828课程网站下载 概述 xff1a 所有向屏幕输出的过程 xff0c 一定是经过参数处理 xff0c 最后组织成一个字符数组 BUFFER xff0c 这个数组 xff08
  • laravel API 接受PUT请求Content-Type:application/x-www-form-urlencoded

    微信小程序 xff1a wx request url https m sybmfw cn api ys user 43 openid method put data that data formdata header content typ
  • 咕咕东的奇妙序列

    题意 xff1a 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限序列 xff1a 112123123412345 这个序列由
  • w15作业--ZJM 与霍格沃兹(必做)

    题意 xff1a ZJM 为了准备霍格沃兹的期末考试 xff0c 决心背魔咒词典 xff0c 一举拿下咒语翻译题 题库格式 xff1a 魔咒 对应功能 背完题库后 xff0c ZJM 开始刷题 xff0c 现共有 N 道题 xff0c 每道
  • 实现WSL2固定IP效果+开机启动

    重启wsl2的发行版后 xff0c 系统分配给发行版的ip每次都不同 想要远程ssh过来或者运行其他需要外部访问的任务时 xff0c windows不知道要把端口转发给哪个ip 解决思路 启动wsl2后 xff0c 运行一个脚本 xff0c
  • Windows连接不上linux虚拟机的问题排查

    Windows连接不上虚拟机的问题排查 今天使用windows连接VMware上安装的linux虚拟机 xff0c 一直连接不上 xff0c 最后花了两个小时才解决了问题 xff0c 这里记录一下 xff0c 供日后参考 说明一下 xff0
  • UE4编写H5遇到的问题

    UE4自从4 16之后 xff0c 就采用emscripten技术进行h5编译 xff0c 游戏H5运行的过程中 xff0c 遇到这么一个问题 xff0c 记录一下 xff1a 数据服务器是一个独立的网站 xff0c 地址为 xff1a h
  • UE4开发HTML5遇到的问题

    最近要做一个基于UE4的HTML5仿真项目 xff0c 没真正做过HTML5的小白 xff0c 表示很无所畏惧 首先 xff0c 找一篇UE4下H5的教程 xff0c 简单学习一遍 xff1a 安装 xff0c 环境 xff0c 项目配置
  • redis windows版本编译

    1 redis for windows 下载地址 xff1a https github com tporadowski redis 2 下载后解压 xff0c 用vs2019打开 redis version msvs RedisServer
  • Ubuntu子系统VcXsrv黑屏compiz (core)

    在windows10上安装图形化ubuntu桌面的步骤 xff1a 1 安装 windows 子系统 ubuntu 1 xff09 在启用或关闭Linux 的 Windows子系统 2 xff09 在Microsoft Store中搜索ub
  • 虚幻引擎5.1版本新增功能

    虚幻引擎5 1版本新增功能 虚幻引擎5 1现已发布 xff01 2022年11月15日 其他应用 功能 广播与实况活动 建筑 影视 模拟 汽车与运输 游戏 虚幻引擎5 1 虚拟制片 我们很高兴地宣布 xff0c 虚幻引擎5 1现已推出 在这
  • vc与dev-c++混合编程 动态链接库c函数调用

    上回书说道 xff0c 如何在vc中使用dev c 43 43 中的类 xff0c 这次说一个更简单的问题 xff0c 如何实现vc调用dev c 43 43 的函数 1 打开dev c 43 43 新建工程 xff0c 选择dll xff
  • 【译】你可能不知道的iOS性能优化建议(来自前Apple工程师)

    作者丨凉介 来源丨掘金 链接 xff1a https juejin im post 5e4cfa4f6fb9a07cce74dba7 今天在推特上看到一篇关于性能优化不错的文章 xff0c 是前苹果开发人员写的 xff0c 翻译了一下与大家
  • c++20 concept

    Visual Studio 2019今天发布了16 3版本更新 xff0c 加入了C 43 43 20的concept支持 xff0c 在此记录一下concept的用法 xff1a concept示例 1 限制只能打印int类型 span