gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:46:15 25 4
gpt4 key购买 nike

让我们从代码开始:

#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 的构造函数得到一个参数太多,因为每个模板都将自己添加为父模板。所以我想知道如何在不修改 Base 的情况下完成这项工作(我可以将 parent 移到最后一个参数并忽略可变参数构造函数的任何过多参数)?我用 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

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

关于c++ - 如何将基类仅链接到其顶级模板化父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24939625/

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