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 回答