在 C++ 中,我们如何使用执行函数的有效 X(Args...) 语法调用所有内容?
In C++ how do we call everything with a valid X(Args...) syntax that execute a function?
在 C++ 中,有一个 Callable
概念以及 std::is_function
类型特征。我想知道标准如何调用 X
,当确切的表达式
X(Args...)
有效并对应一个调用(不包括构造函数和 C 宏)。现在,我可以想到以下适合该类别的内容:
- 函数:
R(Args...)
(带有可选的 const
、volatile
、&
、&&
限定符)
- 函数指针:
R(*)(Args...)
- 函数引用:
R(&)(Args...)
- 仿函数(struct/class 重载
operator()
)
- λ
我的问题:
- 标准如何调用X? (例如:不是
is_function
类型,因为如果 X
是函数指针,则 X(Args...)
有效但 is_function
为假)
- 我是不是忘记了什么东西在我的列表中?
你的问题好像有点糊涂。 std::is_function
仅标识 actual function types. It doesn't even include pointers to functions. The FunctionObject concept 包括您可以应用函数调用运算符的任何对象类型。这基本上涵盖了您的列表。
Callable concept包括函数对象,但它还包括其他东西。 Callable 将成员指针(数据和函数)添加到 FunctionObject 系列的其余部分。
C++ 的 INVOKE
特性适用于所有 Callable 对象。 INVOKE
实际上不是 C++ 中的函数;它只是使用参数列表调用 Callable 对象的算法的标准名称(C++17 纠正了这种荒谬的监督,给了我们 std::invoke
)。该标准的第 20.9.2 节详细介绍了该算法的实现方式。
总的要点就是您所期望的。如果可调用对象是指向成员数据的指针,那么您采用第一个参数,并将其应用于指向成员数据的指针(如果它不是指针,则取消引用该参数)。指向成员函数的指针也是如此,只是您将其余参数作为参数传递。
对于 FunctionObject 类型,您只需使用 ()
调用它,将参数传递给它。
在 C++ 中,有一个 Callable
概念以及 std::is_function
类型特征。我想知道标准如何调用 X
,当确切的表达式
X(Args...)
有效并对应一个调用(不包括构造函数和 C 宏)。现在,我可以想到以下适合该类别的内容:
- 函数:
R(Args...)
(带有可选的const
、volatile
、&
、&&
限定符) - 函数指针:
R(*)(Args...)
- 函数引用:
R(&)(Args...)
- 仿函数(struct/class 重载
operator()
) - λ
我的问题:
- 标准如何调用X? (例如:不是
is_function
类型,因为如果X
是函数指针,则X(Args...)
有效但is_function
为假) - 我是不是忘记了什么东西在我的列表中?
你的问题好像有点糊涂。 std::is_function
仅标识 actual function types. It doesn't even include pointers to functions. The FunctionObject concept 包括您可以应用函数调用运算符的任何对象类型。这基本上涵盖了您的列表。
Callable concept包括函数对象,但它还包括其他东西。 Callable 将成员指针(数据和函数)添加到 FunctionObject 系列的其余部分。
C++ 的 INVOKE
特性适用于所有 Callable 对象。 INVOKE
实际上不是 C++ 中的函数;它只是使用参数列表调用 Callable 对象的算法的标准名称(C++17 纠正了这种荒谬的监督,给了我们 std::invoke
)。该标准的第 20.9.2 节详细介绍了该算法的实现方式。
总的要点就是您所期望的。如果可调用对象是指向成员数据的指针,那么您采用第一个参数,并将其应用于指向成员数据的指针(如果它不是指针,则取消引用该参数)。指向成员函数的指针也是如此,只是您将其余参数作为参数传递。
对于 FunctionObject 类型,您只需使用 ()
调用它,将参数传递给它。