【发布时间】:2018-03-27 01:01:07
【问题描述】:
我试图了解可以作为 std::invoke 的第一个参数传递的事物的概念和类型的层次结构。
让我们考虑一个类型F,这样至少存在一个Args的组合,这样std::is_invokable_v<F, Args...>就是true。
问题[1]:F可以是哪些类型?
这是一个暂定列表:
-
std::function_v<F>等函数是true - 一个函数指针,使得
std::function_v<std::remove_pointer_t<F>>是true - 一个函数引用,使得
std::function_v<std::remove_reference_t<F>>是true - 对函数指针的引用,使得
std::function_v<std::remove_pointer_t<std::remove_reference_t<F>>>是true - 指向成员函数的指针,使得
std::is_member_function_pointer_v<F>是true - 对指向成员函数的指针的引用使得
std::is_member_function_pointer_t<std::remove_reference_t<F>>是true - 指向成员对象的指针,使得
std::is_member_object_pointer_v<F>是true - 对指向成员对象的指针的引用使得
std::is_member_object_pointer_v<std::remove_reference_t<F>>是true - 一个类使得
std::is_class_v<F>是true并且这样F::operator()存在 - 对类的引用,使得
std::is_class_v<std::remove_reference_t<F>>是true并且存在std::remove_reference_t<F>::operator() - 一个联合使得
std::is_union_v<F>是true并且这样F::operator()存在 - 对联合的引用,使得
std::is_union_v<std::remove_reference_t<F>>是true,并且存在std::remove_reference_t<F>::operator() - 闭包类型
- 对闭包类型的引用,使得
std::remove_reference_t<F>是闭包类型
这个列表正确吗?还有其他可行的选择吗?
问题 [2]: 闭包类型只是 lambda 表达式的类型,还是在 C++ 中有其他方法可以创建被视为闭包类型的东西?
问题 [3]: 标准有时会谈到函数对象:问题 1) 列表中的哪些内容被视为函数对象?
问题 [4]: 执行以下操作:
- 闭包类型
- 一个类使得
std::is_class_v<F>是true并且这样F::operator()存在 - 一个联合使得
std::is_union_v<F>是true并且这样F::operator()存在
属于标准中的特定概念(基本上是具有operator() 的东西)?如果不是,那么用于检测类型是否满足所列项目符号之一的类型特征的好名称(例如,如果这样的事物在计算机科学或其他编程语言中具有通用名称)是什么?
【问题讨论】:
-
我认为可调用对象只是“任何
x使得x(some arguments)有效” -
"闭包类型" 这是多余的,因为闭包类型根据定义是类类型。
标签: c++ lambda c++17 functor typetraits