避免重复模板参数来访问类模板中的枚举

时间:2013-03-01 14:51:28

标签: c++ templates enums

考虑一个实现容器的类模板,该容器包含一个选择存储位置的选项。

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成为成员,还是有更好的方法来实现该选项?

2 个答案:

答案 0 :(得分: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 );

答案 1 :(得分: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 {};

通过这种方式,您可以获得具有最小规范的全局可用枚举类。在&lt;之间发生碰撞的可能性不大。类昵称&gt; &LT;枚举类名称&gt;但即使有,使用声明也应该影响(?)任何要干扰的全局标识符(在特殊情况下可以使用声明再次撤消)。