2012-01-12 5 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

このような 'エイリアス'キーワードは、既存のコードを壊さずに古い名前を非難したり、別のデータ構造を透過的に作成したりする場合には、確かに価値があります。 Dは "エイリアス"というキーワードをうまく持っていて、C++は "使う"がありますが、悲しいことにフィールド名ではなくタイプ名にしか使えません。私はいつかC++がDの能力を採用することを願っています(ただし、 "エイリアス"の代わりに "使用する"というキーワードを使用している可能性があります)。 –

答えて

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恐らく最も悪い... –

+0

これは良い妥協点(+1)です。私はこれで生きることができると思います。 – Samaursa

+2

+1ですが、 'const'バージョンも必要です。 –

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

クラス内のマクロを '#define 'した場合、クライアントはそれらを使用できないことに注意してください。しかし、もしそれらを '#define 'しなければ、おそらく結果は悪くなります。 –

+0

@ R.MartinhoFernandes私は自分のハック/マクロ*を可能な限り小さな領域に制限しようとしていました:) – JaredPar

+0

もしあなたがそのような 'm_x'をオーバーロードしようとするなら、どんな場合でも噛んでみたいと思っています。 –

関連する問題