在C ++ 11中理解std :: function的模板参数?

时间:2015-06-10 22:29:20

标签: c++ templates c++11 std std-function

我正在研究一些C ++ 11,并且在理解某些事情时遇到了一些困难。

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

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

bar是一个可调用的对象,其目标是foo,这个函数以两个整数作为参数。

我不明白的是void (int, int)的意思......

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

但是,void (int, int)似乎没有出现在&#34;名称类型&#34;。

  • void (*)(int, int)是一个指向void返回函数的指针,该函数需要两个整数
  • void (Foo*::)(int, int)是指向Foo的void返回函数的指针,该函数需要两个整数

事实上,下面的玩具片段编写得很好。

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会产生另一个错误:&#34;无效声明的函数类型&#34;。

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

感谢您提供任何帮助,我们可以发送。

2 个答案:

答案 0 :(得分:1)

并非所有类型都有值。 void是最知名的例子。

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

该类型可以在模板参数之外的几个位置使用。例如,它可以用于声明方法或函数,或者指向该类型的指针可以用作函数指针,或者引用作为函数引用。

答案 1 :(得分:0)

dyp指出了正确的answer。这是一个重复的问题。

void(int,int)表示&#34;函数签名&#34;和函数签名可以作为模板参数传递。