理解c++ 11中std::函数的模板实参

Understanding the template argument to std::function in C++11?

本文关键字:实参 函数 理解 std c++      更新时间:2023-10-16

我正在复习一些c++ 11,我有一点难以理解的东西。

std::function允许我将任何Callable类型作为函数对象传递。我知道它的作用和如何使用。

void foo(int a, int b) {} 
std::function<void (int, int)> bar = foo;
...

bar是一个可调用对象,其目标是foo,一个接受两个int型作为形参的函数。

我不明白的是void (int, int)到底是什么意思…

  • 我知道这是模板参数我给编译器。
  • 我知道编译器解释说可调用类型必须接受两个int并返回void。

但是,void (int, int)似乎没有"命名类型"。

  • void (*)(int, int)是一个指向void返回函数的指针,该函数接受两个int型参数
  • void (Foo*::)(int, int)是指向Foo的void返回函数的指针,该函数接受两个int值

实际上下面的小代码段可以很好地编译。

class Foo {};
int main(int, char**)
{
    void (*)(int, int);
    void (Foo*::)(int, int);
}

但是添加表达式void (int, int)会导致编译时错误。

在发表我的问题之前,我做了更多的挖掘。编译以下代码片段:

class Foo {};
template <typename T>
struct Bar
{
    typedef T type;
};
void a(int b, int c) {}
int main(int, char**)
{
    void (*)(int, int);
    void (Foo::*)(int, int);
    Bar<int (int, int)> bar;
}

但是试图以任何方式使用Bar::type都会产生另一个错误:"无效声明的函数类型"。


TLDR:表达式void (int, int)究竟是什么意思为什么它是一个有效的模板参数?

谢谢你对我的帮助

不是所有的类型都有值。void是最著名的例子。

void(int,int)只是一个没有值的类型。它是有用的,所以它被使用。

该类型可以在模板参数之外的一些地方使用。例如,它可以用来声明方法或函数,或者指向该类型的指针可以用作函数指针,或者用作函数引用的引用。

dyp为我指出了正确的答案。这是一个重复问题。

void (int, int)表示一个"函数签名",函数签名可以作为模板参数传递。