0

Java には、コンテナ用の詳細なジェネリック クラス階層があります。Java は、IList<T> によって継承され、ArrayList<T> によって実装される ISet<T> によって継承される ICollection<T> のようなインターフェイスを定義します。作成中の C++ ライブラリに同様の階層を作成したいと考えています。

ただし、C++ テンプレートを使用すると、これが非常に面倒になります。たとえば、ISet<T> を定義するとします。

    template<typename T>
    class ISet
    {
    public:
        virtual ~ISet() = 0;
        virtual void add(T e) = 0;
        virtual size_t size() = 0;
        virtual bool isEmpty()
        {
            return size() == 0;
        }
    };

次に、ISet<T> を実装する List<T> を作成したい場合、継承したいがオーバーライドしたくないすべてのメソッドをクラス定義にリストする必要があります。 alist::ISet<T>->isEmpty() のように:

template<typename T>
class List : public ISet<T>
{
public:

    ...

    void add(T e)
    {
        ...
    }

    virtual sz size()
    {
        ...
    }

    using ISet<T>::isEmpty; //well this is annoying
};

私はその理由を理解しています。これらの質問で回答されています: hereおよびhere

私の質問は、基本クラスで継承されているがオーバーライドされていないすべてのメソッドを明示的にリストすることなく、これを達成するためのクリーンな (または任意の!) 方法はありますか?

私が本当に欲しいのは、次のように List<T> に入れることができるものです。

using ISet<T>::*;

これにより、ISet<T> のすべてのメソッドが List<T> のクラス定義に依存し、List<T>::functionName にエイリアスされます。

テンプレート化されたインターフェイスの 1 つを変更するたびに、すべての継承クラスの using ディレクティブのリストを更新することなく、これを実現する方法があることを教えてください!

インターフェイスと共に定義されたディレクティブを使用するプリプロセッサ定義に頼る必要がありますか? ああああああ!

4

1 に答える 1