如何将基类仅链接到其顶级模板化父类

How to link base class only to its top-level templated parent?

本文关键字:父类 基类 链接      更新时间:2023-10-16

让我们从代码开始:

#include <utility>
template<typename T>
class Link : public T
{
public:
    template<typename... Args>
    constexpr Link(Args&&... args) :
            T{*this, std::forward<Args>(args)...}
    {}
private:
    Link *next;
    Link *previous;
};
class Base;
using LinkBase = Link<Base>;
using LinkLinkBase = Link<LinkBase>;
class Base
{
public:
    Base(LinkLinkBase &parent, int a1, char a2, void *a3);
private:
    LinkLinkBase &parent_;
};
LinkLinkBase object {1, 'a' nullptr};

如果我尝试创建一个类型为LinkLinkBase的对象,上面的代码就不起作用了——它失败了,因为Base的构造函数获得了太多的参数,因为每个模板都将自己添加为父模板。所以我想知道如何使这个工作,可能不修改基础(我可以移动父是最后一个参数,忽略任何多余的参数由可变构造函数)?我尝试了enable_if<>Link<>中的多个构造器的一些解决方案,但我所有的尝试都失败了,我没有更多的想法。

我想要实现的是一个STATIC列表,但没有嵌入到Base的一切。

不触碰Base,这里有一些工作…

#include <utility>
struct void_t {};
class Base;
template<typename T>
class Link;
using LinkBase = Link<Base>;
using LinkLinkBase = Link<LinkBase>;
template<typename T>
class Link : public T
{
public:
    template<typename... Args>
    constexpr Link(LinkLinkBase& derived, Args&&... args) :
            T{derived, std::forward<Args>(args)...}
    {}
    template<typename... Args>
    constexpr Link(const void_t&, Args&&... args) :
            T{*this, std::forward<Args>(args)...}
    {}
};

class Base
{
public:
    Base(LinkLinkBase &derived, int a1, char a2, void *a3);
};
LinkLinkBase object {void_t(), 1, 'a', nullptr};
// If you do not like the void, you can wrap this in a factory method

但是对于你正在使用的指针,我不认为你最终会得到一个静态的列表列表…