将 SFINAE 与通用 lambda 结合使用

2024-01-09

泛型 lambda 可以利用“替换失败不是错误”规则 ?例子

auto gL = 
    [](auto&& func, auto&& param1, auto&&... params) 
        -> enable_if_t< is_integral<
            std::decay_t<decltype(param1)>
        >::value>
    {
        // ...
    };

auto gL =  
     [](auto&& func, auto&& param1, auto&&... params) 
        -> enable_if_t< !is_integral<
            std::decay_t<decltype(param1)>
        >::value>
    {
        // ...
    };

是否有任何解决方法或计划将其包含在语言中?另外,由于通用 lambda 是底层的模板化函数对象,因此无法完成此操作不是有点奇怪吗?


Lambda 是底层的函数对象。通用 lambda 是带有模板的函数对象operator()s.

template<class...Fs>
struct funcs_t{};

template<class F0, class...Fs>
struct funcs_t<F0, Fs...>: F0, funcs_t<Fs...> {
  funcs_t(F0 f0, Fs... fs):
    F0(std::move(f0)),
    funcs_t<Fs...>(std::move(fs)...)
  {}
  using F0::operator();
  using funcs_t<Fs...>::operator();
};
template<class F>
struct funcs_t<F>:F {
  funcs_t(F f):F(std::move(f)){};
  using F::operator();
};
template<class...Fs>
funcs_t< std::decay_t<Fs>... > funcs(Fs&&...fs) {
  return {std::forward<Fs>(fs)...};
}

auto f_all = funcs( f1, f2 )生成一个对象,该对象是两者的重载f1 and f2.

auto g_integral = 
  [](auto&& func, auto&& param1, auto&&... params) 
    -> std::enable_if_t< std::is_integral<
        std::decay_t<decltype(param1)>
    >{}>
  {
    // ...
  };

auto g_not_integral =  
 [](auto&& func, auto&& param1, auto&&... params) 
    -> std::enable_if_t< !std::is_integral<
        std::decay_t<decltype(param1)>
    >{}>
{
    // ...
};

auto gL = funcs( g_not_integral, g_integral );

并打电话gL将对两个 lambda 执行 SFINAE 友好的重载解析。

上面在线性继承中做了一些可以避免的虚假动作funcs_t。在工业质量库中,我可能会将继承设为二进制而不是线性(以限制模板的实例化深度和继承树的深度)。


顺便说一句,据我所知,SFINAE 启用 lambda 有 4 个原因。

首先,以新std::function,您可以在多个不同的回调签名上重载一个函数。

第二,上面的伎俩。

第三,柯里化函数对象,当它具有正确数量和类型的参数时,它会进行求值。

第四,自动元组拆包等。如果我使用延续传递风格,我可以询问传入的延续是否接受解包的元组,或者未来解绑的元组等。

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

将 SFINAE 与通用 lambda 结合使用 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 为类型列表创建别名并将其作为模板参数传递

    我正在使用可变参数模板来实现访问者模式 template
  • 字符串/分段错误

    Program to calculate trip and plan flights define TRIP 6 define NAMEMAX 40 define DEST 1 include
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 在 C++ 中,为什么 const 也可以工作时编译器选择非常量函数? [复制]

    这个问题在这里已经有答案了 例如 假设我有一堂课 class Foo public std string Name m maybe modified true return m name const std string Name cons
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 绑定集合的子集

    我有一个ObservableCollection
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • Microsoft Visual Studio 2017 中的 wxWidgets 设置

    我花了大约 20 个小时试图弄清楚如何在 Microsoft Visual Studio 2017 中设置 wxWidgets 我遵循 https wiki wxwidgets org Microsoft Visual C 2B 2B Gu
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • C# 中的 mshtml.HTMLDocumentClass

    在 C 中 我设法从 InternetExplorer 对象获取整个 HTMLDocumentClass 导航到某个 URL 然而 在 Visual Studio 2008 的调试模式下 该特定 URL 的 HTMLDocumentClas
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web
  • 获取线段上最接近另一个点的点[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想找到线段AB上最接近另一个点P的点 我的想法是 Get a1 and b1由直线公式y1 a1x b1 使用 A 点

随机推荐

  • 使用正则表达式将字符串拆分为单词数组

    我正在尝试将字符串拆分为单词数组 但是我想在每个单词后面保留空格 这就是我正在尝试的 var re a z s gi var test test one two three four var results test match re 我期
  • 获取 Sitecore 中单个页面的个人资料关键分数

    我有关于 Sitecore Analytics 和用户个人资料密钥的问题 我需要能够获取单个页面的配置文件密钥的分数 例如 如果我有一个名为 traveler 的个人资料键 该键在给定页面上的值为 1 10 那么我需要能够获取内容作者分配的
  • messageBox.Show() 执行什么操作才能停止 UI 线程的执行?

    在 WPF 应用程序中 我将消息输出到文本框 并在这些消息之间调用一个设置仪器的函数 但是 这些消息都会同时出现 在函数调用结束时 我真的不知道如何清楚地解释我的问题 我会尽力 我有一个 WPF 应用程序 它使用串行端口从仪器获取数据 该应
  • 如何从祖父母标签继承CSS? [复制]

    这个问题在这里已经有答案了 我有一个两级嵌套的 div 我想应用包含类 c 的 div 其宽度与类 a 的 div 相同 如果它是父母 那么我想继承会完成这项工作 但这种情况下该怎么办呢 HTML 代码 div class a div cl
  • 如何将 Cassandra (>2.0) JVM 堆大小设置为 8GB?

    如何将 Cassandra gt 2 0 JVM 堆大小设置为 8GB 当我输入时free m它给了我以下内容 如何将 Cassandra JVM 堆大小设置为 8GB total used free shared buffers cach
  • 重命名 Pandas DataFrame 索引

    我有一个没有标题 带有日期时间索引的 csv 文件 我想重命名索引和列名 但使用 df rename 仅重命名列名 漏洞 我的版本是0 12 0 In 2 df pd read csv r D Data DataTimeSeries csv
  • 设置储值的 Svelte 用户注册问题

    helo 我正在尝试注册用户 成功后将 setContext 设置为新注册的用户 然后导航到主页 服务器正确响应并注册用户 但是当调用 setContext 时 我收到以下错误 index mjs 552 Uncaught 在承诺中 错误
  • EF 可以使用影子属性创建多列索引吗?

    我正在尝试使用影子属性创建多列唯一索引 我知道我只需添加一个属性就可以解决这个问题 但我想看看是否可以通过某种方式保持我的模型干净 要创建多列索引 您可以在 Fluent API 中使用以下选项 modelBuilder Entity
  • iOS/Swift:tableView cellForRowAtIndexPath 崩溃

    我在第 389 行遇到 EXC BREAKPOINT 崩溃 386 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UI
  • Angular 4 Reactive Forms FormControl 错误为 null

    如果我通过 Tab 键浏览文本输入而不输入任何内容 则会显示错误消息 div 指示所需的验证器已正确触发 但是 如果我在其中一个字段中输入任何内容 控制台会立即抛出此错误 Cannot read property required of n
  • Tkinter Entry 小部件之后的事件回调

    从这里的第一个答案 堆栈溢出 6548837 https stackoverflow com questions 6548837 how do i get an event callback when a tkinter entry wid
  • 为什么按钮点击触发与setTimeout()触发不同?

    考虑以下几乎相同的两个片段 区别在于 第一个使用setTimeout 触发事件 第二个在单击按钮时触发事件 如果您检查控制台 您将看到代码段 1 中的最后两行是 App rendering 1 folder s Observed js 片段
  • 为什么 vector::clear 不从向量中删除元素?

    当我使用clear on a std vector 它应该摧毁里面的所有元素vector 但事实并非如此 示例代码 vector
  • 在公式中显示字符串,而不是在 lm fit 中显示为变量

    我无法解决当lm sformula 执行后 它不显示分配给的字符串sformula 我有一种感觉 这是 R 处理函数参数的通用方式 而不是特定于线性回归 下面通过例子来说明这个问题 示例 1 有不受欢迎的 output lm formula
  • 如何更改 Atom 键绑定

    我正在寻找更改 Atom 文本编辑器的键绑定 我熟悉Android Studio Atom 是否允许我们自定义按键绑定 您必须转到 编辑 gt 首选项 gt 按键绑定 在此选项卡中 您可以看到实际的绑定 如果您想更改它 您可以访问键盘映射文
  • Apache Nifi解压

    我是 Apache NIFI 的新手 正在尝试构建一个 POC 流程 我也需要你的指导 我有一个名为 sample gz 的压缩 gz 文件 其中包含一个名为 sample file 的文件 我需要解压缩sample gz 文件并将 sam
  • ggplot2,如何在函数内使用访问数据框元素?

    我正在尝试使用 ggplot2 创建绘图来标准化许多类似绘图的创建 假设您可以使用 theme stat 或 geom 以及 运算符来堆叠大量选项 那么如何将其包装在函数中呢 我想创建一个函数来绘制数据框的各个部分 例如 library g
  • 使用 new 关键字创建的 Spring bean (@Component) 中的自动装配

    我有两颗春豆 如下 Component A Scope prototype public class A extends TimerTask Autowired private CampaignDao campaignDao Autowir
  • 当单元格背景颜色发生变化时,是否可以在 Excel 中触发事件?

    正如标题所说 我试图在单元格更改背景颜色时发生一些事情 比如说从红色变为绿色 但是只有当用户更改单元格中的值时才会触发工作表的更改事件 是否有解决方法来完成我想做的事情 或者这是一项不可能完成的任务 No 如 这是不可能的 VBA 中没有可
  • 将 SFINAE 与通用 lambda 结合使用

    泛型 lambda 可以利用 替换失败不是错误 规则 例子 auto gL auto func auto param1 auto params gt enable if t lt is integral lt std decay t