簡體   English   中英

請幫助解釋這些代碼,也許是C ++中的“ None”?

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

在閱讀folly的源代碼( https://github.com/facebook/folly/blob/master/folly/Optional.h )時,我發現c ++中可能是“無”語法實現,但無法理解這一點。 代碼如下:

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

這些代碼有什么作用? 是“無”成員函數指針嗎? 請幫助,謝謝!

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;

這是用於獲取成員指針值的特殊語法。 可以有效地將其視為某種偏移量:結構NoneHelper在其基本指針的此偏移量處具有一個整數類型的成員變量。

您將能夠使用此語法來修改該整數,而不必明確聲明要修改的整數成員。 例如:

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) ),(希望親愛的上帝)不存儲成員函數可能包含在其中的“偏移量”物體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM