请帮忙解释这些代码,也许是c ++中的“无”?

时间:2014-09-09 13:54:39

标签: c++

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

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

这些代码有什么作用?是"无"成员函数指针?请帮助,谢谢!

2 个答案:

答案 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)),并且(希望亲爱的上帝)不存储成员函数可能包含在对象中的“偏移量”。