考虑一个实现容器的类模板,该容器包含一个选择存储位置的选项。
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
成为成员,还是有更好的方法来实现该选项?
答案 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;但即使有,使用声明也应该影响(?)任何要干扰的全局标识符(在特殊情况下可以使用声明再次撤消)。