繁体   English   中英

C++ 中模板的循环引用,当需要完整类型时

[英]Circular reference of templates in C++, when complete types are required

考虑 C# 中的这个例子:

class C<T> {
   
   void greetMe() { print("Hello you"); }
}

class D : C<E> {
   void useE(E e) {
      e.greetMe();
   }
}

class E : C<D> {
   void useD(D d) {
      d.greetMe();
   }
}

在 C++ 中是否可以使用模板进行等效构造?

我没有任何有用的 C++ 代码可显示,因为我对此的兴趣纯粹是学术性的。 您可以将此代码视为伪代码。

对于好奇的人:我正在研究急切语言处理循环引用的限制,而不是惰性语言。 我记得在 C# 的类型系统中可能会有这样的事情,我试图将其视为一种静态检查的惰性语言。 我记得 C++ 的模板是完全相反的(但仍然有些功能?),我认为这可能是一项有趣的研究。
感谢您的时间!

相关问题

从 Not A Number 的答案扩展到相关问题并在我认为有必要的地方嵌入评论:

template <class T>
class C {
public:
   void greetMe() {  }
};

class E; // forward declare E same as answer to related question
class D : public C<E> {
   void useE(E & e); // Passing by reference should be similar to the behaviour 
                     // of the C# program
                     // only declare function. Fully define later after D is complete
};

class E : public C<D> {
   void useD(D & d) { //D is already complete; we can safely define here
      d.greetMe();
   }
};

// now we can define D's implementation of useE 
void D::useE(E & e) {
   e.greetMe();
}

在定义之前,您不能拥有完整的类型,因为定义是使类型完整的原因。

依赖图中可能永远不会有循环。

也就是说,class D不需要E是完整的。 只有D::useE的定义取决于该定义。 因此,以下定义顺序满足所有依赖项: DED::useE

template <class T>
struct C {
   void greetMe();
};

struct E;
struct D : C<E> {
   void useE(E e);
};

struct E : C<D> {
   void useD(D d) {
      d.greetMe();
   }
};

void D::useE(E e) {
    e.greetMe();
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM