正确使用 `for_each_arg` - 转发过多?

2024-01-02

我真的很高兴发现for_each_arg(...) https://twitter.com/ericniebler/status/559119062895431680,这使得处理参数包变得更加容易。

template<class F, class...Ts>
F for_each_arg(F f, Ts&&...a) {
 return (void)std::initializer_list<int>{(ref(f)((Ts&&)a),0)...}, f;
}

然而,我对其正确用法感到困惑。有很多论据需要完美转发,但我是否进行了不必要的转发?

过度转发会使阅读代码变得更加困难。

struct UselessContainer
{
    // Expects a perfectly-forwarded item to emplace
    template<typename T> void add(T&&) { }   
};

// Creates an `UselessContainer` already filled with `mArgs...`
auto makeUselessContainer(TArgs&&... mArgs)
{
    using namespace std;
    UselessContainer result;

    for_each_arg
    (
        [&result, &mArgs...] // Am I capturing the `mArgs...` pack correctly here?
        (auto&& mX) // Am I passing the arguments to the lambda correctly here?
        { 
            // Is this `forward` necessary?
            result.add(forward<decltype(mX)>(mX)); 

            // Could it be replaced with
            // `result.add(forward(mX));` 
            // ?             
        }, 
        forward<TArgs>(mArgs)... // I assume this `forward` is necessary.
    );

    return result;
}

我所有的问题/疑问都在上面代码示例的注释中表达了。


Every forward在您的代码中确实有必要完美地转发所有参数直到最后。右值引用的名称是左值,因此除非每次传递参数时都进行转发,否则值类别信息将丢失。
也无法调用forward没有显式模板参数列表,因为模板参数仅在一个非推导的上下文中使用。事实上,没有显式参数列表调用的函数模板无法完成这项工作。

您可以尝试使用宏来稍微缩短代码:

#define FORWARD(...) std::forward<decltype(__VA_ARGS__)>(__VA_ARGS__)

然后就变成了

for_each_arg
(
    // Removed superfluous capture
    [&result] (auto&& mX) { 
        result.add(FORWARD(mX));       
    }, 
    FORWARD(mArgs)...
);

也可以使用宏来代替for_each_arg首先:

#define FOR_EACH_ARG(...) (void)std::initializer_list<int>{((__VA_ARGS__),0)...}

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

正确使用 `for_each_arg` - 转发过多? 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • IE 浏览器缓存和 jQuery 表单插件

    就像我之前的许多迷失的灵魂一样 我在 Ajax 表单提交和 IE 浏览器缓存的蛇坑中挣扎 我正在尝试使用 jQuery 表单插件编写一个简单的脚本来 Ajaxify Wordpress 评论 它在 Firefox Chrome Safari
  • 如何使用php从目录中删除文件

    从标题中您可以看到我正在寻找一种从不同目录中删除文件的方法 我在这个主题上能找到的就是 unlink 但是从我在文档中读到的内容以及测试该函数来看 它会从您放入的代码中删除文件名 让我觉得这与关闭文件非常相似 我想做的实际上是使用代码删除文
  • 在传递给非托管代码之前固定可更新结构?

    我使用一些旧的 API 需要将结构指针传递给异步运行的非托管代码 换句话说 在我将结构体指针传递给非托管代码之后 非托管代码复制该指针并立即返回 非托管代码可以在后台的另一个线程中访问该结构 我无法控制在另一个线程或线程本身中运行的非托管代
  • SQL Server 2008 CPU 使用率高

    我们有一个 Windows 2008 R2 Server 其中有一个 SQL Server 2008 该服务器有多个 net 站点 其中包含 SQL Server 数据库 目前 我们的平均 CPU 使用率为 95 其中大部分是由 SQL S
  • 如何在Python中使用Flask解决403错误?

    我在mac中使用python Flask制作了一个简单的服务器 请找到下面的代码 from flask import Flask app Flask name app route methods GET POST def hello pri
  • 循环遍历数据表

    出色地 我有一个包含多列和多行的数据表 我想动态循环数据表 基本上输出应该如下所示 不包括大括号 Name DataColumn Tom DataRow Peter DataRow Surname DataColumn Smith Data
  • Spark迭代HDFS目录

    我在 HDFS 上有一个目录 我想迭代这些目录 有没有简单的方法可以使用 SparkContext 对象对 Spark 执行此操作 您可以使用org apache hadoop fs FileSystem https hadoop apac
  • Stack(int = 10),这个语法是什么意思(C++)?

    template
  • C++/CLI 前向声明

    我有一个标题 如下所示 namespace Dummy ref class ISYSession namespace Afw
  • TFS 向[请求者]用户生成电子邮件警报

    这可能吗 我和我的一位同事正在寻找这种解决方案一段时间 但我们在 Google 上找不到类似的解决方案 事情很简单 当 Requested By 用户破坏了 TFS 2010 上的构建时 我们希望通过电子邮件自动提醒他或她 我们如何才能做到
  • 如何将通知号码添加到按钮图标?

    我正在尝试使用 PyQt5 制作 GUI 它将有一个带有图标的通知按钮 我想在图标上添加一个带有通知数量的小气泡 如果无法提供数字 我想使用红点作为备用方法 但是我应该如何跟踪新通知 如通知侦听器 并在窗口运行时更改图标 我一直在谷歌上搜索
  • c# itextsharp PDF 创建,每页带有水印

    我正在尝试使用 itextsharp Java itext 的 C 端口 以编程方式创建多个 PDF 文档 每个页面上都带有水印 我可以在使用 PdfStamper 创建文档后执行此操作 然而 这似乎涉及重新打开文档阅读它 然后创建一个每个
  • 为什么存在 REP LODS AL 指令?

    换句话说 在任何情况下我可能需要这个指示吗 根据英特尔指令手册 该指令的作用如下 将 E CX 字节从 DS E SI 加载到 AL 以 NASM 为例 section data src db 0 1 2 3 section code mo
  • 如何将自定义 Jupyter 内核放置在虚拟环境中?

    我有一个自定义 Jupyter 内核 它使用使用 matplotlib 样式表的自定义 IPython 配置文件运行 IPython 我知道要正常运行它 我会输入 config matplotlib stylelib 中的 matplotl
  • 在 C# 中计算重复日期的正确方法

    在我的项目中 我需要计算重复事件的日期 一开始我只有一个开始日期 时间以及该事件必须如何重复的信息 Every Day Every Week Every 2 Weeks Every 3 Weeks Every Month Every 2 M
  • 如何使用 Nokogiri::XML::Builder 创建元素名称中带有连字符的 XML?

    我正在尝试使用 Nokogiri 构建 XML 文档 有些元素中有连字符 这是一个例子 require nokogiri builder Nokogiri XML Builder new do xml xml foo bar hello e
  • 使用 maven-surefire 运行测试时,Spring-Autowiring 在 @BeforeClass 之后发生

    我在依赖注入 Spring 自动装配 和 maven surefire 方面遇到一些问题 当使用 TestNG 在 eclipse 中运行时 以下测试可以正常工作 服务对象被注入 然后 BeforeClass 方法被调用 Transacti
  • 带圆角半径的自动布局(带砌体)

    我想用 Masonry 布局一个圆形 UIImageView 所以我创建了这样的 UIImageView self imageView mas makeConstraints MASConstraintMaker make make cen
  • 如何保持 ExpandableListView 打开?

    我正在研究 ExpandableListView 我已经完成了工作 现在我只想做的一件事是我不希望 ListView 在单击可扩展列表视图时变为 DropDown 而是希望显示它与所有项目一起打开无需对其进行任何单击即可显示在内部 谁能告诉
  • 正确使用 `for_each_arg` - 转发过多?

    我真的很高兴发现for each arg https twitter com ericniebler status 559119062895431680 这使得处理参数包变得更加容易 template