从成员函数指针类型中删除类指针
Removing class pointer from member function pointer type
我在 std::is_function 的 cppreference 示例中看到了这个代码片段,我不明白它是如何工作的。有人可以向我解释为什么 U 会像在 PM_traits 中那样被推论吗?
struct A {
int fun() const&;
};
template<typename>
struct PM_traits {};
template<class T, class U>
struct PM_traits<U T::*> {
using member_type = U;
};
int main() {
using T = PM_traits<decltype(&A::fun)>::member_type; // T is int() const&
}
U T::*
是一种类型,当我们有U T::* p
时,p
指向类T
的成员,并且该成员的类型为U
。
fun
是一个类型 int () const &
的函数:一个不带参数并返回int
的const &
限定函数,它是类 A
的成员。因此,在演绎中,T
被推导出为A
,U
被推导出为A::fun
的类型,即int () const &
。
它可能看起来有点令人困惑,因为如果明确拼写了&A::fun
的类型,则必须将其写int (A::*)() const &
。但是,在模板的情况下,类型 int () const &
被"隐藏"在名称 U
后面,因此指向成员的指针只是U A::*
。这类似于如何使用类型名称来简化普通函数指针的语法:
int foo(char, double) { return 42; }
using Fun = int (char, double);
Fun *p = &foo;
// instead of:
int (*q)(char, double) = &foo;
模板中也会发生同样的情况,只是使用 A::*
而不是 *
.
相关文章:
- 使用函数引用指向节点的指针删除链表中的节点?
- 如何通过指向元组的共享指针删除对象
- 函数内的 C++ 指针删除
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- 如何通过存储在 std::list 中的指针删除对象?
- C++中的智能指针删除
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 使用 C 字符串和指针.删除除小写和空格以外的任何字符
- 在特定情况下,指针删除和铸造之间的关系不清楚
- 提升属性树:使用指向节点及其父节点的指针删除节点
- 警告C4150在尝试包装本机C 类时,指向不完整类型的指针删除
- C++ Valgrind 双指针删除,用于防止内存泄漏
- C 通过指向其基类的指针删除派生对象
- 将指针删除到数组
- 当通过其中一个指针删除对象时,C++将所有指针设置为null
- 智能指针删除器和"using"名称为"pointer"关键字
- 通过指向其基的指针删除 POD 对象是否安全
- 模板化的出列无效指针:删除类时失败
- 使用"this"指针删除
- (C++) list.error 方法和使用指针删除内存