【问题标题】:What does `class function<_Res(_ArgTypes...)>` mean?`class function<_Res(_ArgTypes...)>` 是什么意思?
【发布时间】:2021-12-19 20:34:12
【问题描述】:

gcc中std::function的代码有这两行:

template<typename _Res, typename... _ArgTypes>
  class function<_Res(_ArgTypes...)> // <-- unclear to me

第一部分template... _ArgTypes表示“参数包”,即模板参数的可变数量;这很清楚。但第二行很神奇。 好的,写class function&lt;SmthHere&gt; 表示模板特化,所以我们将function 类特化为_Res(_ArgTypes...)。后者看起来像一个带有可变数量参数的函数调用。但是,如果_Resvoid 并且_ArgTypesint,我们会得到void(int):这对我来说没有意义,因为我们不能有一个名为void 的函数并传递一个参数@987654334 @给它(??)。这是特别支持的语法吗?你能澄清一下吗?

【问题讨论】:

标签: c++ variadic-templates parameter-pack


【解决方案1】:

我认为您对声明语法(继承自 C 语言)感到困惑:这里,语法 void(int) 确实 不是 表示名为 void 的函数并采用名为int 正在被调用。相反,它表示一个type,它是一个函数,接受int 类型的参数并返回void

您可以在C++ Reference 阅读更多关于函数声明语法的信息,也有一些示例。

【讨论】:

  • 我现在明白了,想法是:首先,类function 被声明为带有参数signature 的模板。然后稍后引入两个额外的模板参数_Res_ArgTypes,并使用function&lt;_Res(_ArgTypes)&gt; 定义类,并且关键 正如您所写,_Res(_ArgTypes) 实际上是一个类型(函数类型的现有 C 语法)。我见过void (*foo)(int) 之类的东西,但没有意识到这意味着foo 指向void(int) 类型的函数。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2017-02-27
  • 2011-02-25
  • 1970-01-01
  • 2020-02-10
  • 2019-06-16
  • 2012-07-04
相关资源
最近更新 更多