2017-04-13 5 views
0
class Foo // Empty class 
{ 
}; 

template <class T> // Abstract class 
class Comparator 
{ 
public: 
    virtual ~Comparator() {} 

    virtual bool operator()(const T& e1, const T& e2) = 0; 
}; 

// Mother class that contains a map and some other methods that I did not copied here 
template <class Key, class Value, class Comparator = std::less<Key> > 
class Mother 
{ 
private: 
    std::map<Key, Value, Comparator> data_; 
}; 

// Daughter class that wants to use its own Comparator (called Nested) 
class Daughter : public Mother<Foo, Foo, typename Daugher::Nested> 
{ 
public: 
    class Nested : public Comparator<Foo> 
    { 
    bool operator()(const Foo& e1, const Foo& e2) 
    { 
     return true; // Not my real code. However, what would it mean to always return true in this kind of operation ? std::map would be pretty unusable, i guess ? 
    } 
    } 
}; 

入れ子にアクセスする前にDaugherのテンプレートを解決しなかったので、G ++はNestedにアクセスできないため、このコードはコンパイルされません。私がDaughter<?????>::Nestedと書いたらうまくいくかもしれないと思います。しかし、私はDaughterに独自のコンパレータを与える必要があります。なぜなら、それは私がDaughter<?????>で再帰的にアクセスする必要があるためアクセスできませんでした。入れ子になったクラスでテンプレートを解決する

私は、Nestedクラスにアクセスする前にDaughterを解決する必要があるので、私がやろうとしていることがC++では無効であることを確信しています。しかし、私のNestedクラスはかなりシンプルで、実際にその上位クラスを定義する必要はありません。

だから、私はそれFooComparatorか何かを呼び出す、DaughterNestedを宣言することができますが、それはそれはDaughter内部Nestedだったと言ってきれいに見えました。

私の本当の場合には、それは都市を表しているので、私はFoo内部operator<を宣言したくないことに注意してください、と私は都市のoperator<を宣言することは非常にきれいであると思わないで下さい。

Daughterクラスを宣言して独自のコンパレータを使用するように指定できるクリーナオプションがありますか?

答えて

1

実際に私にとっては、コンパレータがFooに該当するので、Daughter内にあると意味がないので、FooComparatorを実装するのが良い解決策です。 Fooを別のクラスからもう一度比較する必要がある場合はどうなりますか?しかし、コンパイラクラスをクラス内に絶対に入れたい場合は、コンパイラをFoo内に実装することができます:

struct Foo { 
    struct Comp: Comparator<Foo> { 
    ... 
    }; 
}; 

class Daughter: public Mother<Foo, Foo, Foo::Comp> 
{ 
    ... 
}; 
+1

おそらく、 'Daughter'内で' Using Nested = Foo :: Comp; ' – Jarod42

関連する問題