c++中的std::conjunction和std::disjunction是什么_c++模板元编程逻辑运算【C++17】

发布时间 - 2026-01-01 00:00:00    点击率:
std::conjunction和std::disjunction是C++17引入的编译期逻辑“与”“或”工具,接受类型参数(如std::true_type或类型特征),支持短路求值;配合std::negation可简洁表达复杂约束,提升SFINAE和concept-like条件的可读性与实用性。

std::conjunctionstd::disjunction 是 C++17 引入的模板元编程工具,用于在编译期对多个类型特征(如 std::is_integral_v)或布尔常量进行逻辑“与”和逻辑“或”运算。

它们本质是编译期布尔值的折叠

这两个类模板不是函数,而是可变参数模板别名,内部利用模板偏特化实现短路语义(类似运行时 && / || 的行为):

  • std::conjunction:当所有模板参数 Bi 都是 std::true_type(即其 ::valuetrue)时,整个表达式为 true;任意一个为 false,立即得 false(不实例化后续)。
  • std::disjunction:只要有一个 Bistd::true_type,结果就是 true;全为 false 才得 false;遇到第一个 true 就停止(短路)。

使用场景:简化 SFINAE 和约束条件

以前写多个 std::enable_if_t 嵌套很麻烦,现在可以直接组合判断:

  • 比如要求类型 T 同时是整型、有默认构造、且可复制:
template
std::enable_if_t,
    std::is_default_constructible_v,
    std::is_copy_constructible_v
>> foo() { /* ... */ }
  • 又如:允许传入任意一个支持 size()length() 成员的类型:
template
std::enable_if_t,
    std::is_member_function_pointer_v
>> bar(const T& t) { /* ... */ }

注意:参数必须是类型,不是布尔值字面量

你不能直接写 std::conjunction —— 这会编译失败。必须传入满足 std::bool_constant<...> 接口的类型,比如:

  • ✅ 正确:std::conjunction<:true_type std::is_same int>>
  • ✅ 更常用(C++17 起推荐):std::conjunction_v<:is_integral>, std::is_signed>_v 后缀是 value 的变量模板)
  • ❌ 错误:std::conjunction>true 不是类型)

还有 std::negation:逻辑非

虽然没在标题里提,但它常和前两者搭配使用:

  • std::negation<:is_void>>::value 等价于 !std::is_void_v
  • std::negation_v<:is_reference>> 更简洁

它也支持短路(单参数,意义不大),但语义清晰、可读性好。

基本上就这些。它们不复杂,但让模板约束更接近自然语言逻辑,避免深层嵌套和手写特化,是现代 C++ 元编程的实用基础工具。


# 工具  # c++  # 常量  # 整型  # 可变参数  # int  # 布尔常量  # 接口  # 类模板  # Length  # 特化  # 多个  # 都是  # 自然语言  # 第一个  # 布尔值  # 这两个  # 布尔  # 可以直接  # 但它 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在阿里云服务器自主搭建网站?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  javascript中闭包概念与用法深入理解  Laravel如何使用Vite进行前端资源打包?(配置示例)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel怎么使用Intervention Image库处理图片上传和缩放  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  微信小程序 五星评分(包括半颗星评分)实例代码  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  简历在线制作网站免费版,如何创建个人简历?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  微信小程序制作网站有哪些,微信小程序需要做网站吗?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  java获取注册ip实例  如何快速搭建个人网站并优化SEO?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何在万网开始建站?分步指南解析  如何正确下载安装西数主机建站助手?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  详解jQuery中的事件  Laravel模型事件有哪些_Laravel Model Event生命周期详解  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  高防服务器租用首荐平台,企业级优惠套餐快速部署  香港服务器选型指南:免备案配置与高效建站方案解析  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在腾讯云服务器上快速搭建个人网站?  如何在IIS管理器中快速创建并配置网站?  HTML 中动态设置元素 name 属性的正确语法详解  利用python获取某年中每个月的第一天和最后一天  详解MySQL数据库的安装与密码配置  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  如何在万网ECS上快速搭建专属网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  Laravel如何优化应用性能?(缓存和优化命令)  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层