2012-01-12 52 views
8

如果我有以下代碼:我可以別名變量而不會產生引用的存儲成本嗎?

struct someStruct 
{ 
    int x; 
    int y; 
} 

class someClass 
{ 
    public: 
    someStruct m_member; 

    alias  m_x = m_member.x; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
    alias  m_y = m_member.y; // I am aware alias is not a keyword and even if it was, I cannot assign it a value like this 
} 

我能給別名m_member.xm_member.y,而不會導致引用(這是一樣的指針)的額外存儲成本?類似於typedef的東西?

+1

Nod。如果您想在不破壞現有代碼的情況下棄用舊名稱或透明地編寫另一個數據結構,那麼這樣的「別名」關鍵字肯定會很有價值。 D令人愉快地擁有「別名」關鍵字,而C++有「使用」,但它只能用於類型名稱而不是字段名稱。我希望C++有朝一日會採用D的能力(但它可能是通過「使用」關鍵字而不是「別名」)。 – 2014-07-24 22:06:23

回答

10

您可以編寫嵌入式接入功能:

class someClass 
{ 
public: 
    someStruct m_member; 
    int& mx() { return m_member.x; } 
    int& my() { return m_member.y; } 
    int const& mx() const { return m_member.x; } 
    int const& my() const { return m_member.y; } 
}; 

然後你就可以訪問成員如下:

someClass foo; 
foo.mx() = 3; 
foo.my() = 2*foo.mx(); 

這不是正是相同語法,但是很接近,而且一個合理的編譯器會合作完全優化內聯函數。

+1

+1可能是最少的邪惡...... – 2012-01-12 00:52:45

+0

這是一個很好的折中(+1),我想我可以忍受這一點。 – Samaursa 2012-01-12 00:57:02

+2

+1,但也應該有'const'版本。 – 2012-01-12 01:06:30

1

在這種情況下,我只是使用一個參考,因爲它是他們適合的。如果引用開銷太大,我只會放棄別名並使用完整的表達式。

但是你可以用宏實現這一目標(讀:邪惡

class someClass 
{ 
    public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 

#undef m_x 
#undef m_y 
}; 

我會強烈建議雖然這樣做。與所有宏一樣,雖然它有一些意想不到的後果(可能導致該類型內的其他有效使用m_x的引用不正確)。

例如

struct s1 { 
    int m_x; 
}; 

class someClass { 
public: 
    someStruct m_member; 
#define m_x m_member.x 
#define m_y m_member.y 

    ... 
    void Example(S1& s1) { 
    s1.m_x = 42; // This wouldn't compile and you'd get terrible error messages 
    } 
}; 
+1

請注意,如果您在類中使用'#undef'宏,則客戶端無法使用它們。但是如果你不''解僱他們,結果可能會更糟糕。 – 2012-01-12 00:52:20

+0

@ R.MartinhoFernandes我試圖限制我的*黑客/宏*到最小的可能區域:) – JaredPar 2012-01-12 00:53:17

+0

我想如果你要重載'm_x'那樣的話,你會在任何情況下都會被咬傷。 – 2012-01-12 00:53:40

相關問題