了解std :: function的晦涩模板参数

时间:2018-07-07 12:37:29

标签: c++ c++11

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,因此不会编译。 如果正确,我在哪里可以在标准中找到有关此类型的功能的更多信息?

2 个答案:

答案 0 :(得分: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 并且什么都不返回。

答案 1 :(得分:0)

正如您所指出的,该类型只是一个函数类型,它是 C++ 类型系统中定义良好的类型,在规范的第 3.9.2 节中定义:

<块引用>

3.9.2 复合类型

<块引用>

——函数,具有给定类型的参数并返回空或给定类型的引用或对象

程序:

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

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

编译就好了。它不会做的是link——你会得到像

这样的错误
prog.cpp:6: undefined reference to `myFunc(int)'

因为您已经声明了一个函数(并调用了它),但从未定义过它。