gpt4 book ai didi

c++ - 在 CRTP 中使用内部类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:29 27 4
gpt4 key购买 nike

有没有可能在 CRTP 中使用内部类或枚举?例如。

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

最佳答案

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

A class is considered a completely-defined object type (or complete type) at the closing }

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

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

#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 上查看它的启动和运行情况.

关于c++ - 在 CRTP 中使用内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859050/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com