传递给 std::function 模板的模板参数到底代表什么?
What exactly is represented by the template parameter passed to std::function template?
std::function
本身提供了一个很好的实用程序——它提供类型擦除以一般地存储/提供对可调用对象的访问。它的灵活性很好:
#include <functional>
#include <iostream>
void printer() {
std::cout << "I print!";
}
int adder(int a, int b) {
return a + b;
}
int main() {
std::function<void()> fun1 = printer; // fun1() calls printer()
std::function<int(int, int)> fun2 = adder; // fun2(1, 2) calls adder(1, 2)
std::function<void()> fun3 = [](){}; // fun3() will do nothing - same for the lambda
std::function<int(int, int)> fun4 =
[](int a, int b) { return a + b; }; // fun4(1, 2) will yield the sum
}
而且,老实说,一切都说得通。 std::function<void()>
表示它是一个 function
,调用时 returns void
并且不接受 (()
) 参数。 std::function<int(int, int)>
的同上 - 调用时,它 returns 一个 int
并且需要两个 int
作为参数。
虽然直观,但我相信我对 是 显式模板参数缺乏基本的理解。 void()
或 int(int, int)
究竟是什么?它们不能是函数指针,因为当我这样做时:
int main() {
using type = void();
type x = printer;
}
我收到以下警告和错误:
main.cpp:15:10: warning: declaration of 'void x()' has 'extern' and is initialized
type x = printer;
^
main.cpp:15:14: error: function 'void x()' is initialized like a variable
type x = printer;
^~~~~~~
嗯,显然它看起来像一个变量 - 我希望它是一个变量。但是,如果我想要一个函数指针,我将不得不这样做:
using type = void(*)();
而不是:
using type = void();
省略*
的类型到底是什么?当与 std::function
?
一起使用时,直观显式模板参数究竟代表什么
What exactly is the type with omitted *?
想一想。一个类型"followed by"一个*
表示"pointer to that type"。如果您没有 "follow" 带有 *
的类型,那么该类型就表示该类型。所以如果你有一个函数指针,那么它就是一个指向...函数类型的指针。
因此,像 void()
这样的类型是函数类型。
函数类型不同于对象类型,但它们仍然是类型。因此,您可以使用 C++ 允许的大多数基于类型的游戏。但是因为它们不是对象类型,所以你不能创建函数类型的对象。
What exactly is void()
or int(int, int)
?
它们是函数类型。例如。如果你声明 void foo()
,foo
的类型是 void()
:
#include <type_traits>
int main() {
static_assert(std::is_function_v<int(int, int)> &&
std::is_function_v<void()> &&
std::is_same_v<decltype(main), int()>);
}
std::function
本身提供了一个很好的实用程序——它提供类型擦除以一般地存储/提供对可调用对象的访问。它的灵活性很好:
#include <functional>
#include <iostream>
void printer() {
std::cout << "I print!";
}
int adder(int a, int b) {
return a + b;
}
int main() {
std::function<void()> fun1 = printer; // fun1() calls printer()
std::function<int(int, int)> fun2 = adder; // fun2(1, 2) calls adder(1, 2)
std::function<void()> fun3 = [](){}; // fun3() will do nothing - same for the lambda
std::function<int(int, int)> fun4 =
[](int a, int b) { return a + b; }; // fun4(1, 2) will yield the sum
}
而且,老实说,一切都说得通。 std::function<void()>
表示它是一个 function
,调用时 returns void
并且不接受 (()
) 参数。 std::function<int(int, int)>
的同上 - 调用时,它 returns 一个 int
并且需要两个 int
作为参数。
虽然直观,但我相信我对 是 显式模板参数缺乏基本的理解。 void()
或 int(int, int)
究竟是什么?它们不能是函数指针,因为当我这样做时:
int main() {
using type = void();
type x = printer;
}
我收到以下警告和错误:
main.cpp:15:10: warning: declaration of 'void x()' has 'extern' and is initialized type x = printer; ^ main.cpp:15:14: error: function 'void x()' is initialized like a variable type x = printer; ^~~~~~~
嗯,显然它看起来像一个变量 - 我希望它是一个变量。但是,如果我想要一个函数指针,我将不得不这样做:
using type = void(*)();
而不是:
using type = void();
省略*
的类型到底是什么?当与 std::function
?
What exactly is the type with omitted *?
想一想。一个类型"followed by"一个*
表示"pointer to that type"。如果您没有 "follow" 带有 *
的类型,那么该类型就表示该类型。所以如果你有一个函数指针,那么它就是一个指向...函数类型的指针。
因此,像 void()
这样的类型是函数类型。
函数类型不同于对象类型,但它们仍然是类型。因此,您可以使用 C++ 允许的大多数基于类型的游戏。但是因为它们不是对象类型,所以你不能创建函数类型的对象。
What exactly is
void()
orint(int, int)
?
它们是函数类型。例如。如果你声明 void foo()
,foo
的类型是 void()
:
#include <type_traits>
int main() {
static_assert(std::is_function_v<int(int, int)> &&
std::is_function_v<void()> &&
std::is_same_v<decltype(main), int()>);
}