在阅读愚蠢的源代码(https://github.com/facebook/folly/blob/master/folly/Optional.h)时,我发现了一个可能的"无" c ++中的语法实现,但无法理解。代码如下:
namespace detail { struct NoneHelper {}; }
typedef int detail::NoneHelper::*None;
const None none = nullptr;
这些代码有什么作用?是"无"成员函数指针?请帮助,谢谢!
答案 0 :(得分:5)
None是空指针。这很清楚。但是空指针也有类型。 NoneHelper
是一个辅助类,它没有其他功能,只能使None
的类型唯一。
它是指向成员的指针,因为这种指针的转换次数有限。特别是,您不能意外地将指向对象的指针强制转换为指向成员函数的指针。
答案 1 :(得分:1)
None是整数类型指针成员的typedef。
想象一下你有一个结构
namespace detail
{
struct NoneHelper
{
int a;
int b;
int c;
};
};
你可以说:
typedef int detail::NoneHelper* None;
const None memberA = &detail::NoneHelper::a;
这是获取指向成员指针值的特殊语法。它可以有效地被认为是某种偏移:struct NoneHelper有一个类型为integer的成员变量,与它的基指针相距偏差。
您可以使用此语法修改该整数,而无需显式声明要修改的整数成员;例如:
void setToFive(detail::NoneHelper& object, const None ptrToMember)
{
// .* is an operator that is used to dereference pointer-to-member variables
object.*ptrToMember = 5;
}
detail::NoneHelper obj;
obj.a = 1;
obj.b = 2;
obj.c = 3;
None ptrToA = &detail::NoneHelper::a; //Acquire the relative location of member a
None ptrToB = &detail::NoneHelper::b; //Acquire the relative location of member b
setToFive(obj, ptrToA); //Sets the value of "obj.a" to 5
setToFive(obj, ptrToB); //Sets the value of "obj.b" to 5
std::cout << obj.a << obj.b << obj.c; // should print out "553"
编辑:请注意,“偏移”的想法仅适用于“指向对象成员的指针”。指向成员的指针语法也可以用于成员函数(int (SomeType::*)(int arg1)
),并且(希望亲爱的上帝)不存储成员函数可能包含在对象中的“偏移量”。