理解c++ 11中std::函数的模板实参
Understanding the template argument to std::function in C++11?
我正在复习一些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)表示一个"函数签名",函数签名可以作为模板参数传递。
相关文章:
- 成员函数指针的模板实参演绎
- 函数和函数作为模板函数的实参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 函数模板中返回类型的模板实参演绎
- 带有const实参的c++构造函数
- 函数指针作为模板实参而不是函子
- 当涉及一个重载函数作为实参时,模板实参推导是如何工作的
- 将函数形参的实参解包到c++模板类
- 从模板实参的子类中推断函数模板形参
- 函数对象应该是函数实参还是它的引用?
- 如何传递操作符作为默认函函数实参
- c++模板类:没有构造函数实例与实参列表匹配
- c++函数中理论上可以作为形参传递多少个实参
- Const正确性- Const指针作为函数实参
- 如何在c++函数模板中指定默认的非模板实参初始化式
- vc++函数模板实例化错误C2664当使用不同的枚举实参时
- 析构函数的模板实参推导
- 将vector传递给函数时,默认实参(如果有的话)应该是什么?
- 当对象类型为模板实参时,是否有办法将模板实参传递给对象上的函数
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型