2011-10-20 13 views
1

共通の動作と同じコンストラクタと演算子を持ついくつかの型があります。いくつかのように見える:構造的に同一のクラスを区別するC++

class NumberOfFingers 
{ 
public: 
    void operator=(int t) { this->value = t; } 
    operator int() const { return this->value; } 
private: 
    int value; 
}; 

は同じです。

各クラスは異なる振る舞いを持ち、ここでの例です:

std::ostream& operator<<(std::ostream &s, const NumberOfFingers &fingers) 
{ 
    s << fingers << " fingers\n"; 
} 

std::ostream& operator<<(std::ostream &s, const NumberOfFingers &toes) 
{ 
    s << toes << " toes\n"; 
} 

どのように私は明確なクラス型を維持しながら、クラス定義で重複を最小限に抑えることができますか? NumberOfFingersNumberOfToesは、コンストラクタと演算子を失うので、共通の基底クラスから派生させたくありません。私はよい答えがテンプレートを含むだろうと思います。

+3

を伴うだろうという点で、はい、あなたは正しいですか? –

+0

@Björn何を言ってるの?派生クラスは独自クラスを持たない場合、常に基本クラスのコンストラクタと演算子を使用できますか? – paperjam

答えて

5

それはあなたが共通のベースからの継承を使用すると、コンストラクタと演算子を失うことになるだろうと思わせる何かテンプレート:)

enum {FINGERS, TOES...}; 
... 
template<unsigned Type> //maybe template<enum Type> but I havent compiled this. 
class NumberOfType 
{ 
public: 
    void operator=(int t) { this->value = t; } 
    operator int() const { return this->value; } 
private: 
    int value; 
}; 
... 
typedef NumberOfType<FINGERS> NumberOfFinger 
typedef NumberOfType<TOES> NumberOfToes 
... so on and so forth. 
+3

列挙型の代わりに型を使用するほうが良いかもしれません。 'struct fingers_tag'、 'typedef NumberOfType NumberOfFinger'などです。このように、可能なすべての型のバリエーションを指定する単一の場所を持つ必要はありません。 –

+0

@ Constantin実際、実際には、そのようなタイプのセットを閉じたり開いたりするかどうかによって異なります。しかし、それは確かに我々がセットを開いたままにしたい場合は行く方法です。 – Akanksh

関連する問題