繁体   English   中英

使用内部类与CRTP

[英]Using inner class with CRTP

是否有可能使用CRTP的内部类或枚举? 防爆。

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

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

一类被认为是在闭合完全定义的对象类型(或完整的类型) }

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

您可以通过单独传递枚举来解决它,但它需要您在其他地方定义枚举(另一个基类?外部范围?无论如何......)。 您可以使用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上查看并运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM