【问题标题】:Avoid repeating the template parameter for accessing enum in class template避免重复模板参数以访问类模板中的枚举
【发布时间】:2013-03-01 14:51:27
【问题描述】:

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

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

【问题讨论】:

  • 我不明白 hmjd 的想法怎么可能奏效。
  • 你试过这个'using type= Container::StorageOption'吗?
  • 有一个丑陋的解决方案,您可以将枚举从类中取出并将其命名为ContainerStorageOption

标签: c++ templates enums


【解决方案1】:

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

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

【讨论】:

  • 对!我一直在想一个像这种多态性一样小的东西是一把锤子。但我想这就是 C++ 的本意。
  • @Frank,没有多态,ContainerBase 不是多态
  • @Frank 这不是以太组合,它只是继承
  • @WillemD'haeseleer 确定它是继承。但是如果你看看它是如何在编译器中实现的,你会注意到它是作为组合实现的。派生类通过组合继承其所有基类的成员。多态性是一个例外。
【解决方案2】:

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

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声明也应该隐藏(?)任何全局标识符将干扰(在特殊情况下,可以再次撤消另一个使用声明)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 2023-03-22
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多