如何将基类仅链接到其顶级模板化父类
How to link base class only to its top-level templated parent?
让我们从代码开始:
#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
但是对于你正在使用的指针,我不认为你最终会得到一个静态的列表列表…
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 错误:基类在从基类父派生类 Son 时未定义
- 抽象基类调用父级的纯虚函数
- 当父类共享指针为返回类型时返回新的基类
- c++ 派生基类 Friend 函数访问父级上的私有函数
- 获取基派生(子)类对象中的基类指针(父级)
- 在c++中导出没有基类的父类
- 如何将基类仅链接到其顶级模板化父类
- 从父类调用基类重载操作符
- 正确的方法使基类设置父类
- 错误:基类构造函数必须显式初始化父类构造函数
- C++虚拟基类:不调用父级的复制构造函数