- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我真的很高兴发现了for_each_arg(...)
,这使得处理参数包变得更加容易。
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;
}
我所有的问题/疑问都在上面代码示例的注释中表达。
最佳答案
您代码中的每个 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)) );
关于c++ - `for_each_arg` 的正确用法 - 转发过多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28263000/
我在 JBoss 6 上使用 JSF 2。我制作了一个示例应用程序,它使用 JSF 作为 View ,使用 EJB 作为逻辑,使用 JPA 作为持久性。 JSF 中的 bean 具有 RequestS
我打开气流并检查了连接,然后发现背后有太多连接。 关于如何杀死那些我不使用的想法,或者我很想知道运行它的最低conn_id的任何想法。 建筑 LocalExecutor(与其他经纪人不同) Postg
我收到错误 style.css:1 GET https://www.example.com/cs_CZ净::ERR_TOO_MANY_REDIRECTS 可能与我的 htaccess 有关吗? Rew
我收到错误 style.css:1 GET https://www.example.com/cs_CZ净::ERR_TOO_MANY_REDIRECTS 可能与我的 htaccess 有关吗? Rew
我正在 Android 中开发一个应用程序,我有以下 XML 布局:
我有 5 个类用作运算符: TurnOn , TurnOff , PushBox , Exit , Enter 对于每种类型,我都有一个包含该类型描述的字符串。 例如: class Places {
我们在使用 lettuce redis 库时遇到了这个具体问题。我们收到太多 RedisCommandTimeoutException。我们在 redis-cli 中设置了 2 秒的超时,在 redi
在 Controller 类文件中,大多数方法函数都包含try/catch块,如下所示: try { $stmt = $this->prepare($sql); $st
我读到这个page附加很多元素是不好的做法,我应该在循环的每次迭代期间构建一个字符串,然后将 DOM 元素的 HTML 设置为该字符串。在循环中使用过多的 HTML 是否也是如此? 我有一个解析 JS
在我的应用程序日志上运行 logcat 时,我看到很多 GC_FOR_ALLOC 而没有 GC_CONCURRENT 消息。我知道我有内存泄漏,但在堆栈和其他站点的任何地方,logcat 消息都有很多
当我检查我的 Tomcat 应用程序管理器时,我发现我的 session 太多(超过 4600): 为什么会这样?这可以链接到已部署的应用程序,还是它已经运行了很长时间? 最佳答案 这可能有多种原因,
所以我试图在一个 div 中运行 3 个 float ,但我遇到了这个问题。 http://jsfiddle.net/sPUjQ/101/ 点我 每当我运行两次 float 时,背景颜色会保持不变,但
为什么在使用 http_build_query 函数构建查询字符串时,它会将方括号 [] urlencode 到值之外,如何摆脱它? $query = array("var" => array("fo
在一个过程中,我需要使用许多 if-else 条件来决定列的值。该脚本以 FOR rec IN (SELECT....) LOOP Begin 并决定许多不同的值 rec 子记录可以在每次迭代中获得。
我们基于 Java 的服务器应用程序报告异常长的类加载时间: # jstat -class 10625 1000 Loaded Bytes Unloaded Bytes Time 4
我正在使用 Kraken.js 开发一个应用程序并管理我决定使用的 session :connect-mongo。 我有这样的设置: 'use strict'; var session = requi
我在 iPad 应用程序中有 180 个 UILabels(UITableViewCells 的 subview ),每个 UILabel 的宽度为 155 X 155,并且每个包含大量 Unicod
所以基本上,如果我将 JPanel 放入使用 GridBagLayout 的 JPanel 中,并使用 setPreferredSize 限制大小>,最终它达到了无法容纳所有这些的地步,并且它表现出附
我目前使用的是 Play 2.2.1,在白天运行生产 Web 应用程序后,我的日志中开始出现以下错误。似乎我的连接已用完/我一定没有正确关闭某些东西,但我似乎无法弄清楚它是什么。 2014-02-11
所以我几乎完成了我的元素,我打算创建一个完整的网页 slider 作为我网站的背景主题,并且它运行完美! 问题是它的垂直拉伸(stretch)太长,您可以向右滚动(您不应该那样做)而且我不知道为什么它
我是一名优秀的程序员,十分优秀!