gpt4 book ai didi

C++ CRTP 和从基访问派生的嵌套类型定义

转载 作者:IT老高 更新时间:2023-10-28 22:20:55 25 4
gpt4 key购买 nike

编辑:当我为任何感兴趣的人更改我的设计时,我会在此处放置一个 github 链接。

背景

我正在替换 boost::intrusive , intrusive_set ,我自己的实现是 64 位编译的侵入集,将 3 x 8 字节的指针填充到我的容器节点中。我的容器有 2^16 个节点的限制,因此我可以使用 2x 16 位偏移序数将其降低到每个节点 4 字节(大小减少 6 倍)。

在下面的示例中 base是侵入集容器。 derived类有 std::vector<container_entry_type<entry_type> > .显然,在这种间接级别下,我需要在派生中拥有一堆嵌套的 typedef,我想在 base 中引用它们。

ps,容器用于数据描述语言的 AST。因此,包含的元素是小型数据类型,并且 3 x 8 字节非常重要。尤其是因为容器用于在紧密循环中验证数据集。

孤立的问题

我想实现以下语义:

template<typename TWO>
class base
{
public:
void foo(typename TWO::dummy & d);
};

template<typename DUMMY>
class derived
: private base< derived<DUMMY> >
{
public:
typedef DUMMY dummy;
};

struct tag{};

int main()
{
derived<tag> foo;
}

但我无法从基础访问嵌套的 typedef。这就是clang对此事的看法:

main.cc: In instantiation of ‘base<derived<tag> >’:
main.cc:9:7: instantiated from ‘derived<tag>’
main.cc:20:16: instantiated from here
main.cc:5:8: error: no type named ‘dummy’ in ‘class derived<tag>’

相反,我必须这样做:

template<typename type_key>
class traits
{
public:
typedef type_key dummy;
};

template<typename TWO, typename type_key>
class base
{
public:
void foo(typename traits<type_key>::dummy & d);
};

template<typename DUMMY>
class derived
: private base< derived<DUMMY>, DUMMY >
{
public:
typedef DUMMY dummy;
};

struct tag{};

int main()
{
derived<tag> foo;
}

这是实现我的用例的唯一方法吗?它只会让事情变得更加冗长。我想派生也可以从特征派生以节省一些击键。

另一种选择是不使用派生并将逻辑直接连接到当前派生的内容中。但是,我想单独对基础进行单元测试。

最佳答案

另一种可能性(可能会或可能不会节省击键)是在某些地方不使用派生类在父类中的嵌套类型。例如。而不是

void foo(typename TWO::dummy & d);

你会使用

template <class T>
void foo(typename T& d);

为了加分,您可以使用 SFINAE 将 T 实际限制为原始变体允许的类型。 (请注意,在嵌套模板中,TWO::dummy 可以自由使用 - 它们仅在 整个内容(包括 derived 已被, 所以它成功了。在天真的版本中,derived 在实例化 base 及其成员函数时仍然不完整,它没有 ::dummy ,这就是它失败的原因)

关于C++ CRTP 和从基访问派生的嵌套类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113878/

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