通过模板编译时父子关系

Compile-time parent child relationship through templates

本文关键字:父子关系 编译      更新时间:2023-10-16

这主要是出于好奇。我想知道是否有办法在编译时使用模板定义父类型到子类型的关系。

template <class T>
struct parent_t {
  T *child;
};
template <class T>
struct child_t {
  T *parent;
};

由于尝试构造时无限的模板递归,这似乎是不可能的:

auto parent = new parent_t<child_t<parent_t< (... to infinity)

您可以使用额外的间接层来做到这一点:

template <typename T> struct parent;
template <typename T> struct child;
struct Traits {
    using p = parent<Traits>;
    using c = child<Traits>;
};
template <typename T>
struct parent {
    typename T::c* child;
};
template <typename T>
struct child {
    typename T::p* parent;
};
int main()
{
     parent<Traits> p{nullptr};
     child<Traits> c{nullptr};
     c.parent = &p;
     p.child = &c;
}