我们正在阅读Herb Sutter的Exceptional C ++书籍作为课堂作业的一部分。
我有一个问题是要了解typedef实际上在做什么和解密 如何构建:第36项:
如果能够通过typefef的逻辑来帮助某人,那将是一个很大的帮助。
class B
{
public:
virtual ~B();
void operator delete (void*, size_t) throw();
void operator delete[] (void*, size_t) throw();
void f(void*, size_t) throw();
}
class D : public B
{
public:
void operator delete (void*) throw();
void operator delete[] (void*) throw();
};
typedef void (B::*PMF)(void*, size_t);
PMF p1 = &B::f;
PMF p2 = &B::operator delete;
由于B类(PMF)中没有指向成员函数的指针, 什么是PMF以及它是如何创建的?
typedef的返回类型是否为void? 是(void *和size_t)typedef的参数?
由于
答案 0 :(得分:6)
typedef
关键字为现有类型声明别名。
例如
typedef int integral;
integral i = 1;
行typedef void (B::*PMF)(void*, size_t);
为类型声明别名PMF
:指向函数的指针(指向 void
和 size_t
)返回 void
。
有关如何使用螺旋规则解释复杂声明中的类型的详细说明,请参阅此链接:The Clockwise/Spiral Rule
PMF
是该类型的别名。它可用于声明指向任何作为B成员的函数的指针,并具有相同的参数列表和返回类型。
PMF p1 = &B::f; // Declare p1 as a PMF and set it to point to address of B::f.
B b; // Create instance of B (needed as p1 points to a member function).
(b.*p1)(nullptr, 0); // Here p1 can be used as if it was a call to B::f.
答案 1 :(得分:0)
正如在评论中已经解释过的那样,PMB是指向B的成员函数的指针,它采用给定的参数列表。它是新类型的名称 - 它与B类本身的任何内容都不对应。
答案 2 :(得分:0)
正如Borgleader已经指出的那样,typedef
允许你引用具有B
返回类型和两个参数的void
类的成员函数:a {{1} }指针和void
。
我很确定PMF是公共成员函数的首字母缩写......