2012-12-09 13 views
5

は、私は以下のクラスがあるとしましょう:私の派生クラスで派生クラスの基本クラスのメンバーに別名を付けることはできますか?

template <class T> 
class Base { 
    protected: 
    T theT; 
    // ... 
}; 

class Derived : protected Base <int>, protected Base <float> { 
    protected: 
    // ... 
    using theInt = Base<int>::theT;  // How do I accomplish this?? 
    using theFloat = Base<float>::theT; // How do I accomplish this?? 
}; 

は、私が派生クラスで、より理にかなって、より直感的な名前を使用してBase::theTを参照したいと思います。私はGCC 4.7を使用していますが、これはC++ 11の機能をかなりカバーしています。上記の例でどのように試したか、このようなことを達成するためにusingステートメントを使用する方法はありますか?私はC++ 11で、usingというキーワードをエイリアスの型として使うことができることを知っています。保護された基底クラスのメンバをpublicスコープにします。メンバのエイリアシングに類似のメカニズムはありますか?

+4

私はあなたが参照を必要とするか、おそらく派生クラスのスペースを占有しない関数だと思います。 :| – Xeo

+0

ありがとうございました。 –

答えて

6

Xeoのチップが機能しました。あなたがC++ 11を使用している場合は、そのように別名を宣言することができます。

int &theInt; 
float &theFloat; 
// ... 
Derived() : theInt(Base<int>::theT), theFloat(Base<float>::theT) { 
    theInt = // some default 
    theFloat = // some default 
} 

int &theInt = Base<int>::theT; 
float &theFloat = Base<float>::theT; 

あなたがC++ 11を持っていない場合、私はあなたにも、コンストラクタでそれらを初期化することができると思います

EDIT: 少し煩わしいのは、コンストラクター本体(中括弧の内側)まで、エイリアスメンバーの値を初期化できないことです。

+3

これは、 'sizeof(void *)'と参照数を掛け合わせることによって、派生クラスのサイズを増加させることに注意してください。だから私は 'theXXX'という簡単なゲッター関数の提案を含んでいます。 – Xeo

+0

はい、私はあなたが正しいと思います。幸いにも、Derivedクラスのインスタンスがあまりないので、私は8バイト余分に私を殺してくれるとは思わないので、データメンバにアクセスするときに型参照しやすいリファレンスバージョンを使用できます。 –

関連する問題