理解std::function的模板参数问题

6

std::function有一个模板参数:

template< class R, class... Args >
class function<R(Args...)>

我想知道,R(Args...) 是什么类型,我认为它既不是一个函数指针 T

template<class R, typename... Args>
using T = R(*)(Args...);

也不能是 函数引用 Q

template<class R, typename... Args>
using Q = R(&)(Args...);

所以类型P是指:
template<class R, typename... Args>
using P = R(Args...);

简单地说,这是一个函数

我可以声明这样的一个函数并调用它:

int main(){
  P<int,int> myFunc;
  myFunc(3);
}

由于myFunc从未被定义,因此它不会编译。如果这是正确的,请问在标准中我可以找到更多关于这种函数类型的信息?


1
这并不是“晦涩难懂”的。它是一个带有参数包的模板(parameter pack)。 - Jesper Juhl
1
这是一个很好的问题。我从很多年前学习C++的过程中了解到“调用签名”的特殊化,但从未见过相关文档。我很想知道是否有cppreference上的文章介绍或它是否在标准中提到。 - Richard Hodges
3
我认为你的示例中缺少了 R,应该是 template<typename R, typename... Args> using P = R(Args...); - user7860670
1
回复:标准中的位置。那应该是dcl.fct - Igor Tandetnik
3
int f(int); 是一个函数声明,其类型为 int(int),与 int f[10] 声明一个类型为 int[10] 的数组的方式相同。请注意,这里只是声明函数而不是定义函数。 - Barry
显示剩余4条评论
2个回答

1
正如您所注意到的那样,类型只是一个函数类型,在C++类型系统中是一个完全定义良好的类型,在规范的第3.9.2节中定义:
3.9.2 复合类型
- 函数,具有给定类型的参数并返回给定类型的 void 或引用或对象。
程序:
template<class R, typename... Args>
using P = R(Args...);

int main(){
  P<int,int> myFunc;
  myFunc(3);
}

编译完全没有问题。它无法完成的是链接 - 您将收到类似于以下错误的错误

prog.cpp:6: undefined reference to `myFunc(int)'

由于您声明了一个函数(并调用它),但从未定义它。

0

正如您在cppreference上所看到的,

template< class R, class... Args >
class function<R(Args...)>

这只是一个 std::function 的原型,它以参数包 Args 作为参数并返回类型为 R 的内容。

两个简单的例子

  • std::function<const int&()> F([]{ return 42; }); 不带参数并返回一个 const int &

如果您声明:

void print_num(int i)
{
    std::cout << i << '\n';
}
  • std::function<void(int)> f_display = print_num; 接受一个 int 参数并返回空。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接