Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates D是否允许在模板中分离接口和实现? 我还没有尝试过,但是它看起来是一个非常有趣的语言,它已经找到了C++中一些问题的巧妙解决方案。我很好奇,它是否也使在模板中分离接口和实现成为可能?如果是,那么如何?_Templates_Interface_Implementation_D - Fatal编程技术网

Templates D是否允许在模板中分离接口和实现? 我还没有尝试过,但是它看起来是一个非常有趣的语言,它已经找到了C++中一些问题的巧妙解决方案。我很好奇,它是否也使在模板中分离接口和实现成为可能?如果是,那么如何?

Templates D是否允许在模板中分离接口和实现? 我还没有尝试过,但是它看起来是一个非常有趣的语言,它已经找到了C++中一些问题的巧妙解决方案。我很好奇,它是否也使在模板中分离接口和实现成为可能?如果是,那么如何?,templates,interface,implementation,d,Templates,Interface,Implementation,D,否使用的任何模板都在编译时完全展开 这意味着编译器需要知道模板的完整代码,从而不可能将其保留在.di文件中在处理模板使用过程中的某个时刻,D需要有关模板的所有信息。但是,没有理由需要将这些信息编码为原始源代码(OTOH,作为实现细节,所有当前的D编译器都需要这样做)。这是任何具有比泛型更强的模板的语言的一个基本问题。这一点的含义取决于您试图做什么 如果您对分离接口和实现感兴趣的是隐藏实现(如在C中提供二进制库和头文件),那么这是无法做到的。你能得到的最接近的是某种代码混淆系统 另一方面,如果您希

否使用的任何模板都在编译时完全展开


这意味着编译器需要知道模板的完整代码,从而不可能将其保留在
.di
文件中

在处理模板使用过程中的某个时刻,D需要有关模板的所有信息。但是,没有理由需要将这些信息编码为原始源代码(OTOH,作为实现细节,所有当前的D编译器都需要这样做)。这是任何具有比泛型更强的模板的语言的一个基本问题。这一点的含义取决于您试图做什么

如果您对分离接口和实现感兴趣的是隐藏实现(如在C中提供二进制库和头文件),那么这是无法做到的。你能得到的最接近的是某种代码混淆系统

另一方面,如果您希望避免为每次重新编译重新处理模板的成本,那么更通用的方法(如二进制预编译头格式)可以允许在编译其他几个模块时重用词法、语法和某些过程的结果。事实上,使用D比使用C更简单


第三种选择是链路时间代码生成,但这与传统的链接几乎没有什么区别,传统的链接积极使用anolog来预编译头。

编译器可以避免需要模板的全部源代码的唯一方法是,将部分编译的模板保持为中间格式,然后在实例化模板时使用该格式,而且不存在这样的中间格式。您需要完整的模板定义来实例化模板。C++中存在同样的问题。模板用于生成代码,这是一个基本问题。C++中的导出模板是试图解决问题的方法,但它没有用,因为它是模板的基础。J.J.N.我知道这几乎正是我想说的。也许吧,但在我看来不是这样的。您的回答让人觉得您需要的源代码只是一个实现细节,可能在某个点上是固定的,但事实并非如此。您将始终需要完整的源代码。只是理论上可以使用该源代码的部分编译版本,而不是原始源代码(尽管我怀疑这种情况是否会发生),但不管怎样,所有这些信息都是需要的。分离模板的接口和实现基本上是不可能的。我必须同意Jonathan的观点,BCS,你的答案不是特别清楚。