簡體   English   中英

如果可能,取消引用 C++ 指向類型的指針

[英]Dereferencing C++ pointer to type if possible

class Foo {
public:
    static const int BAR = 2;
};

typedef Foo T1;
typedef Foo* T2;

int value1 = T1::BAR;  // This works.
int value2 = T2::BAR;  // This doesn't work.

可以從T2中提取BAR的值嗎?

我正在使用 c++-11。

我想這將是不好的做法,但很好奇是否可以做到。

是的。

您可以使用特征剝離指針:

int value2 = std::remove_pointer<T2>::type::BAR;

或者(C++14 起):

int value2 = std::remove_pointer_t<T2>::BAR;

參考現場演示

這甚至不是不好的做法,除非有一些更具表現力的方式來實現你的真正目標。

您可以創建T2類型的 object 並訪問成員BAR ,如下所示:

int value2 = T2{}->BAR;

請注意,取消引用 null 指針以訪問 static 數據成員的格式是否正確尚有爭議。 無論這個解決方案是否正確,我都建議使用Asteroids With Wings 的答案,因為它更清楚地表達了代碼應該實現的意圖。

讓我們先看看錯誤(你應該總是這樣做):

<source>:11:14: error: 'T2' (aka 'Foo *') is not a class, namespace, or enumeration
int value2 = T2::BAR;// This doesn't work.

這很清楚。 Foo*確實不是 class 類型、名稱空間或枚舉。

您可以通過std::remove_pointer從類型中刪除指針:

int value2 = std::remove_pointer_t<T2>::BAR; // This is awkward, but no error

暫無
暫無

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

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