在类模板中访问enum时避免重复使用模板形参

Avoid repeating the template parameter for accessing enum in class template

本文关键字:形参 访问 enum      更新时间:2023-10-16

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

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

通常通过在基类中定义它来实现。

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 );

我自己一直在与这个问题作斗争,我真的不喜欢对基类的需求,也不喜欢在想要使用枚举类时需要重复基类说明符的方式。我想到了这个解决方案:

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 {};

这样你就可以用最小的规格拥有全局可用的枚举类。碰撞不太可能发生在<类昵称> <</p>

但是即使有,using声明也应该遮蔽将要干扰的任何全局标识符(在特殊情况下,可以用另一个using声明再次撤消)。