5

格納場所を選択するオプションを含むコンテナを実装するクラス テンプレートを考えてみましょう。

template<class T>
class Container {
public:
  enum StorageOption {A,B};
  Container(StorageOption opt_): option(opt_) {}
private:
  StorageOption option;
};

StorageOptionクラスでのみ使用されるため、ここがメンバーとして選択されました。

ここで、クラスをインスタンス化するには、次のようにテンプレート パラメーターを繰り返す必要があります。

{
  Container<int> c( Container<int>::A );
}

パラメータを繰り返さないようにすると同時にStorageOptionメンバーになる方法はありますか、それともオプションを実装するより良い方法はありますか?

4

2 に答える 2

7

これは通常、基本クラスで定義することによって実現されます。

class ContainerBase {
public:
  enum StorageOption {A,B};
};


template<class T>
class Container : public ContainerBase{
public:
  Container(StorageOption opt_): option(opt_) {}
private:
  StorageOption option;
};

Container<int> c( ContainerBase::A );
于 2013-03-01T14:55:21.647 に答える
0

私は自分自身でこの問題と戦ってきましたが、基本クラスの必要性と、列挙型クラスを使用するときに基本クラス指定子を繰り返す必要がある方法があまり好きではありません。私はこの解決策を思いつきました:

namespace FuncEnum{
    enum class FuncNeighbor{
        FLOOR, CEILING, SELF
    };
    enum class FuncDirection{
        BACK, FRONT, BACKNFRONT
    };
    enum class FuncVar{
        X, Y
    };
} using namespace FuncEnum;

template<typename... Types>
class Func {};

このようにして、最小限の仕様でグローバルに使用可能な列挙型クラスを作成できます。< クラスのニックネーム > < 列挙型のクラス名 > の間で衝突が発生する可能性は低いですが、たとえ衝突があったとしても、using 宣言は、干渉しようとしているグローバル識別子をシャドー (?) する必要があります (特殊なケースでは、別の using で元に戻すことができます)。宣言)。

于 2015-09-06T17:45:35.863 に答える