我正在研究一些C ++ 11,并且在理解某些事情时遇到了一些困难。
std::function
让我将任何Callable类型作为函数对象传递。我知道它的作用以及如何使用它。
void foo(int a, int b) {}
std::function<void (int, int)> bar = foo;
...
bar
是一个可调用的对象,其目标是foo
,这个函数以两个整数作为参数。
我不明白的是void (int, int)
的意思......
但是,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)
究竟是什么意思和为什么它是一个有效的模板参数?
感谢您提供任何帮助,我们可以发送。
答案 0 :(得分:1)
并非所有类型都有值。 void
是最知名的例子。
void(int,int)
只是一种没有值的类型。它很有用,所以它被使用了。
该类型可以在模板参数之外的几个位置使用。例如,它可以用于声明方法或函数,或者指向该类型的指针可以用作函数指针,或者引用作为函数引用。
答案 1 :(得分:0)
dyp指出了正确的answer。这是一个重复的问题。
void(int,int)表示&#34;函数签名&#34;和函数签名可以作为模板参数传递。