使用内部类与CRTP

时间:2017-08-24 10:19:51

标签: c++ crtp

是否有可能在CRTP中使用内部类或枚举?实施例

template<typename Container>
struct ContainerBase
{
    std::map<typename Container::Enum, int> _;
};
struct ConcreteContainer : ContainerBase<ConcreteContainer>
{
    enum class Enum
    {
        left,
        right
    };
};

1 个答案:

答案 0 :(得分:4)

没有。在类模板中,派生类尚未完全定义(这不是标准中的完整对象)。
In fact(工作草案):

  

在结束}

时,类被视为完全定义的对象类型(或完整类型)

因此,您无法期望能够从类模板中访问其中一个成员或您在派生类中声明的任何内容。

您可以通过单独传递枚举来解决它,但它需要您在其他地方定义枚举(另一个基类?外部范围?无论如何......)。您可以使用traits类来解决。等等。
有几种方法可以做到这一点,但是你不能直接访问派生类中定义的枚举 以下是可行解决方案的示例:

#include <map>

template<typename> struct traits;

template<typename Container>
struct ContainerBase
{
    std::map<typename traits<Container>::Enum, int> _;
};

template<>
struct traits<struct ConcreteContainer> {
    enum class Enum
    {
        left,
        right
    };
};

struct ConcreteContainer : ContainerBase<ConcreteContainer>
{};

int main() {
    ConcreteContainer cc;
    cc._[traits<ConcreteContainer>::Enum::left] = 0;
    cc._[traits<ConcreteContainer>::Enum::right] = 1;
}

wandbox上查看并运行。