Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of

2024-06-21

有人看过 Andrei Alexandrescu 在 GoingNative2013 中关于爆炸元组的演讲吗?

这是我不太明白的一段代码:

template <class F, class... Ts>
auto explode(F&& f, const tuple<Ts...>& t)
    -> typename result_of<F(Ts...)>::type
{
    return Expander<sizeof...(Ts),
       typename result_of<F(Ts...)>::type,
       F,
       const tuple<Ts...>&>::expand(f, t);
}

result_of 中的 F(Ts...) 给我带来了很多麻烦。我的意思是: F 不是代表函数类型吗? 我很了解 R(Ts...) ,但是这里的 R 是一个返回类型,但是在 R 应该在的地方使用 F ,这就是让我发疯的原因...

谁能帮我理解这里奇怪的 F(Ts...) 吗?

以下是 Andrei Alexandrescu 演讲的链接:http://channel9.msdn.com/Events/GoingNative/2013/The-Way-of-the-Exploding-Tuple http://channel9.msdn.com/Events/GoingNative/2013/The-Way-of-the-Exploding-Tuple


您想问的问题可能与此问题重复:为什么 std::result_of 采用(不相关的)函数类型作为类型参数? https://stackoverflow.com/questions/15486951/why-does-stdresult-of-take-an-unrelated-function-type-as-a-type-argument

我们来剖析一下:

std::result_of<F(Ts...)>::type

所以,在某个地方namespace std,我们有一个类模板result_of<>。它需要一个模板类型参数;也就是说,它看起来基本上是这样的:

template<typename Foo>
struct result_of
{
    typedef FOOBARBAZ type;
};

好的,我们用参数实例化这个模板F(Ts...)。这是不寻常的语法!你想必知道Ts是一个参数包,因此Ts...括号内的内容将在编译时扩展为逗号分隔的类型列表,例如int, double, bool。所以我们有F(int, double, bool)。好的,这是一个函数类型。

Just as int(char)意思是“功能采取char并返回int”,也如此F(int, double, bool)意思是“功能采取int, double, bool并返回F".

“但是等等,”你说。 “我想F已经是我的功能类型了!”

Yes. F is your函数类型。但期望的类型std::result_of is, really!,该函数类型包含在another函数类型。详细说明:

typedef int (*F)(char);
typedef F G(char);
static_assert(std::is_same< std::result_of<G>::type, int >::value);
static_assert(std::is_same< std::result_of<F(char)>::type, int >::value);
static_assert(std::is_same< std::result_of<int (*(char))(char)>::type, int >::value);

上面的每一行都完全相同:F(char)只是一种更美观的写作方式int (*(char))(char)。当然,你不可能总是侥幸逃脱,因为有时F是不能从函数返回的函数类型:

typedef int F(char);
std::result_of<F(char)>;  // fails to compile

正如@Simple 在评论中写道,std::result_of<F(Ts...)>::type总是可以用不太聪明但也不那么令人困惑的表达来代替

decltype( std::declval<F>() ( std::declval<Ts>()... ) )

即“decltype调用类型值的结果F带有类型参数Ts...。在这里,没有古怪的高级函数类型;一切都按照您自然期望的方式进行。就我个人而言,我可能会使用decltype在我自己的代码中使用这种方法,只是因为它更容易理解;但我想有些人会更喜欢std::result_of方法,因为它表面上看起来更简单并且受到标准的支持。每个人都有自己的。 :)

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

Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of 的相关文章

随机推荐

  • 将不同的单词保存到链接列表中

    基本上我这里有两个链接列表 列表和不同的 有几组单词之前已保存到 列表 结构中 我要编写一个程序 它会找到不同 唯一的单词并将其保存到 不同 结构中 这是我到目前为止根据我的指针概念得到的结果 然而 当我尝试打印 distinct 时 程序
  • 如何在 StateListDrawable 中设置可绘制对象的 alpha 值?

    我想在按下时更改可绘制对象的 alpha 值 因此 我创建了两个可绘制对象并将它们放入 StateListDrawable 中 并设置按下状态的 alpha 值 但它就是行不通 StateListDrawable content new S
  • 为什么我们应该在 git commit 命令中使用 -m ?

    git commit m my commit 我们使用此命令将提交添加到我的 Github 存储库 这个 m 是什么意思 Do a git commit help m是为了留言 这将出现在您的提交历史记录中 例子 git commit m
  • 将 IRandomAccessStreamWithContentType 转换为 Byte[]

    在我的应用程序中 我允许用户使用 ContactPicker 添加联系人 我尝试将 IRandomAccessStreamWithContentType 转换为 Byte IRandomAccessStreamWithContentType
  • Cornerstone 与 Mac OS X 版本 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在张量流中保存模型

    Tensorflow 允许我们使用 tf train write graph 方法保存 加载模型的结构 以便我们可以在将来恢复它以继续我们的训练 但是 我想知道这是否有必要 因为我可以创建一个模块 例如 GraphDefinition py
  • 比例背景图像

    我想放大和缩小页面中的背景图像 我尝试过多种方法 但似乎没有一种方法能按照我想要的方式工作 我的页面的网址是http quaaoutlodge com drupal 7 14 http quaaoutlodge com drupal 7 1
  • d3.js:将样式应用于单行

    正在尝试可拖动网络 http bl ocks org mbostock 4566102并希望能够对不同的链接使用不同的颜色 当我注释掉这些行时 var link svg append g attr class link selectAll
  • Cython memoryviews:使用数组参数包装 c 函数以传递 numpy 数组

    我正在尝试使用 Cython 用数组参数包装 c 函数 quick sort 所以我可以将 numpy 数组传递给它 我已经在文档 SO 和网络中搜索了一个可行的 最小的示例 但没有找到它 我已经尝试了几种可能性 但没有任何进展 所以请帮我
  • 在网页上发送Apache Kafka数据

    我正在构建一个实时能源监控系统 其中数据来自传感器 每秒都会有新的数据 使用的数据将被聚合并呈现为图表 我研究过大量数据的实时流处理 这让我想到了 Apache Kafka 现在我的网络应用程序正在使用 Express js 我在用kafk
  • 有什么方法可以加快 Postgres 位图堆扫描速度吗?

    这里是数据库新手 这是我的查询 我使用的是 Postgres 9 3 5 explain analyse SELECT SUM actual cost as cost SUM total items as num items process
  • WordPress:tax_query 使用 OR 运算符的多个术语

    简单的查询 但由于某种原因没有显示正确的帖子 尝试显示带有每月待办事项清单术语 如果没有结果 则显示带有社区活动术语的帖子 有什么建议么 todo args array cat gt my category id posts per pag
  • gitbranch --merged 使用管道命令

    有没有办法达到相当于 git branch merged 使用 git 管道命令 我知道有类似的命令git for each ref它为您提供提交哈希值及其相应的引用名称 是否有一个命令可以判断某个提交是否可以从另一个提交访问 这基本上就是
  • 使用 RegEX 在 Notepad++ 中添加前缀和附加

    我在 txt 文件中有相当大的单词列表 我正在尝试在 Notepad 中进行正则表达式查找和替换 我需要在每行之前和之后添加一个字符串 这样 wordone wordtwo wordthree become able wordone abl
  • 禁用 Chrome 开发者工具 ⌘-[0-9] 键盘快捷键?

    Is it possible to disable the 0 9 keyboard shortcuts in Chrome s developer tools It s frustrating to accidentally hit th
  • Javascript - 获取和设置基元的属性隐式创建对象包装器

    我正在读一本书 名叫有效的 JavaScript 利用 JavaScript 力量的 68 种具体方法 第 4 点 Prefer Primitives to Object Wrappers 并遇到这句话 获取和设置基元的属性会隐式创建对象
  • 自动将文本转换为十进制数 - Access

    我正在尝试使用 ODBC 将数据从 MS SQL Server DB 导入到 MS Access 对于大多数数据类型 导入会正确映射类型 但当 SQL Server 列数据类型为十进制数时 MS Access 会将其转换为文本数据类型 因此
  • 如何检测android中的颠倒方向?

    在我的 Android 应用程序中 我有全景图像 并且我使用 TYPE ORIENTATION 传感器根据手机运动旋转该图像 它对于横向和纵向都工作良好 这是旋转逻辑的代码 Override public void onSensorChan
  • REGEX (javascript) - 允许字母数字字符和不在第一个位置的特殊字符

    我想设计一个正则表达式 允许使用字母数字字符以及其他字符 只要它们不在第一个位置即可 例子 VALID Test VALID Hello123 VALID 456 Hi VALID 456 789 VALID Hi 777 VALID 33
  • Andrei Alexandrescu 关于爆炸元组的演讲中奇怪的 result_of

    有人看过 Andrei Alexandrescu 在 GoingNative2013 中关于爆炸元组的演讲吗 这是我不太明白的一段代码 template