通过模板编译时父子关系

Compile-time parent child relationship through templates

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

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;
}