请帮助解释这些代码,也许是C ++中的'None'?

please help explain these code , maybe the 'None' in c++?

本文关键字:中的 None 解释 帮助 代码 也许      更新时间:2023-10-16

在阅读愚蠢的源代码时(https://github.com/facebook/folly/blob/master/folly/Optional.h),我在c++中找到了一个可能是"None"的语法实现,但无法理解这一点。代码如下:

namespace detail { struct NoneHelper {}; }
typedef int detail::NoneHelper::*None; 
const None none = nullptr;

这些代码的作用是什么?"None"是成员函数指针吗?请帮忙,谢谢!

None是空指针。这很清楚。但是空指针也有类型。NoneHelper是一个助手类,它除了使None的类型唯一之外没有其他功能。

它是指向成员的指针,因为这种指针的转换有限。特别是,不能意外地将指向对象的指针强制转换为指向成员函数的指针。

None是指向整数类型成员的指针的typedef。

想象一下你有一个结构

namespace detail 
{ 
    struct NoneHelper 
    { 
        int a;
        int b;
        int c; 
    }; 
};

你可以说:

typedef int detail::NoneHelper* None; 
const None memberA = &detail::NoneHelper::a;

这是一种用于获取指向成员值的指针的特殊语法。它可以有效地被认为是某种偏移:structNoneHelper有一个类型为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)),并且(希望上帝保佑)不会存储成员函数可能包含在对象中的位置的"偏移量"。