如何过滤 std::integer_sequence

2023-11-21

如果理论上我有一个整数序列,例如

std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>

我如何用一些编译时谓词过滤它以获得可能更小的std::integer_sequence<int, ...>?

为了便于讨论,假设我只想要偶数值, 这导致了“如何使以下 static_assert (或类似的东西)通过?”的问题。

static_assert(std::is_same_v<std::integer_sequence<int, 0, 2, 4, 6, 8>,
              decltype(FilterEvens(std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{}))>, 
              "Integer sequences should be equal");



This question was inspired by thinking about how we might accomplish removing duplicates between two bitsets (this question), assuming we could represent the bitsets as integer_sequences containing only 0 and 1. Bonus points if you can solve that one in this manner, too


过滤序列相当于将一个值序列转换为最多一个值的序列序列,然后将它们连接起来。也就是说,过滤出偶数值<0,1,2,3>与将其转换为序列相同<<0>,<>,<2>,<>>并连接以产生<0,2>.

对于 C++17,这需要的代码非常少。我们将从我们自己的值和序列类型开始(您可以轻松地将std::integer_sequence to a value_sequence):

template <auto >
struct value { };

template <auto... Vals>
struct value_sequence { };

我们使用自己的原因是我们可以向其中添加运算符。喜欢+:

template <auto... As, auto... Bs>
constexpr value_sequence<As..., Bs...> operator+(value_sequence<As...>,
                                                 value_sequence<Bs...> )
{
    return {};
}

我们将使用它进行串联。接下来,我们添加一个函数将单个值转换为包含零个或一个元素的序列:

template <auto Val, class F>
constexpr auto filter_single(value<Val>, F predicate) {
    if constexpr (predicate(Val)) {
        return value_sequence<Val>{};
    }
    else {
        return value_sequence<>{};
    }
}

最后,我们只需要我们的顶级filter把它们放在一起:

template <auto... Vals, class F>
constexpr auto filter(value_sequence<Vals...>, F predicate) {
    return (filter_single(value<Vals>{}, predicate) + ...);
}

原始示例的用法:

constexpr auto evens = filter(
    value_sequence<0, 1, 2, 3, 4, 5, 6, 7, 8, 9>{},
    [](int i) constexpr { return i%2 == 0; });

C++17 多酷啊!

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

如何过滤 std::integer_sequence 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 将加载的目标地址保留在寄存器中,直到指令退出

    我想使用基于事件的精确采样 PEBS 来记录 XeonE5 Sandy Bridge 上特定事件的所有地址 例如缓存未命中 However the Performance Analysis Guide for CoreTM i7 Proce
  • 使用正则表达式和 JavaScript 突出显示 html 中的单词 - 几乎就在那里

    我正在编写一个 jquery 插件 它将执行浏览器样式的页面查找搜索 我需要改进搜索 但还不想解析 html 目前我的方法是获取整个 DOM 元素和所有嵌套元素 然后简单地对给定术语运行正则表达式查找 替换 在替换中 我将简单地在匹配的术语
  • 如何解码 OSRM 中的编码折线并绘制路线几何图形?

    我正在使用 OSRM OpenStreetMap 路由机 的实例来评估不同点的距离和时间 使用 API 我可以检索我想要和需要的信息 尤其是作为折线的真实路线 直到今天 我已经在起点和终点之间绘制了直线 segments lon patie
  • 随机重新排序(打乱)矩阵的行?

    我想随机重新排序矩阵 A 的行以生成另一个新矩阵 在 R 中如何做到这一点 Use sample 以 伪 随机顺序生成行索引并使用以下命令对矩阵重新排序 create a matrix A for illustration A lt mat
  • 检测浏览器是否支持嵌入媒体自动播放 - YouTube playVideo() 和 iOS

    检测浏览器是否支持嵌入媒体文件自动播放的最佳方法是什么 在 iOS 也可能是 Android 设备上使用 youtube javascript API 如果您调用playVideo 在用户点击视频之前 视频处于不良状态并且基本上无用 当您想
  • CSS :: .className 和 div.className 之间的区别

    我写了一个 html 元素 如下所示 div class box Foo box div 并像这样编写CSS box width 400px height 40px color red text align center or div bo
  • 从 PID 中获取名称?

    我在 OSX Mountain Lion 上 并尝试使用 PID 检索进程的名称 以下是我正在使用的代码 pid t pid 10687 char pathBuffer PROC PIDPATHINFO MAXSIZE char nameB
  • 在 android marshmallow 上获取 realPath 返回 null?

    我正在使用此函数从 uri 获取图像路径 private static String getRealPathFromURI Context context Uri contentUri Cursor cursor null try Stri
  • 如何让 xdebug var_dump 显示完整的对象/数组

    我在用xdebug php xdebug 2 1 2 5 3 vc9 dll 上WAMP 当我使用var dump在大对象或变量上 它不显示完整的变量 array node gt array my form gt array form gt
  • Visual Studio:使用属性使视图代码默认

    我知道怎么做配置 VS 2008 在代码中而不是设计器中打开 Windows 窗体控件 但我想我已经找到了一种方法 可以使用一个可以装饰所需控件的属性来实现此目的 有人知道它的名字吗 如果您希望在设计器中打开一些控件并在 C 代码视图中打开
  • 无法使用 JavaScript 在 IE 上打印 iframe,而是打印父页面

    我有以下 JavaScript 代码 document ready function a print button click function event event preventDefault var print url print
  • XMLHttpRequest 无法从模拟器上的 android asset 文件夹加载文件

    我是混合开发的新手 我编写了一个启动 webview 的小应用程序 我在 asset 文件夹中复制了 XML JS 文件 应用程序在我的三星平板电脑上运行良好 但在模拟器上出现以下错误 05 30 06 09 07 080 I 铬 1245
  • @font-face导轨3.2

    我正在考虑尝试使用 font face 在我的 Rails 应用程序中使用 font squirrels 字体 希望这是解释它的正确方式 我对此还比较陌生 所以希望有人能就如何让它在 Rails 应用程序中工作提供建议 Thanks 好吧
  • Mysql 在使用 LIKE 搜索时连接两列

    我正在尝试进行 MySQL 查询 其中使用 LIKE 关键字根据搜索文本过滤记录 例如 如果用户搜索Illusion Softwares where Illusion是名字并且Softwares是姓氏 因此查询应搜索列 FirstName
  • 获取多行 UILabel 最后一行的宽度

    我有一个动态多行 UILabel 需要知道可见文本 不是标签 的文本结尾 X 坐标 以便我可以在文本后面显示一些内容 这可能吗 谢谢 您将能够使用 CoreText 框架更好地控制文本布局 查看文档 还有一些不错的开源东西已经为您做了很多艰
  • Android 布局土地不工作

    我一直在 stackoverflow 中查看问题 并尝试了我所见过的所有方法 但布局区域不起作用 在我的代码中我有和方法onConfigurationChanged Override public void onConfigurationC
  • 未知未知的本机崩溃

    我有一个完全用 Java 编写的应用程序 没有任何本机代码 并且我在开发人员控制台上两次收到崩溃报告 未知未知的本机崩溃 我不知道从哪里开始查找问题的根源 搜索仅在 Android 错误 NDK 使用或有错误的第三方库的情况下发现这种类型的
  • 在 Python 中一次更改列表中的多个项目

    我可以在Python中一次更改列表中的多个项目吗 问题1 例如 我的清单是 lst 0 0 0 0 0 我想要第三项和第五项变成99 我知道我可以做到 lst 2 99 lst 4 99 然而 有没有更简单的方法来做到这一点呢 问题2 在这
  • 如何在不安装 numpy 的情况下使用它?

    我通过控制台访问没有 root 或 sudo 权限的计算机 Python版本是2 5 2 numpy不可用 我无法使用 python setup py install user 机器上也没有任何可用的编译器 我可以以某种方式使用可用的编译包
  • 如何过滤 std::integer_sequence

    如果理论上我有一个整数序列 例如 std integer sequence