[英]Separating template interface and implementation in C++
这是一个后续问题: 将export关键字与模板一起使用
正如在原始问题的答案中所提到的,'export'在C ++ 0x中已被弃用,即使对于C ++ 03也很少得到编译器的支持。 鉴于这种情况,可以用什么方式隐藏lib文件中的实际实现,只是通过头文件公开声明,以便最终用户可以知道公开的API的签名是什么,但是无法访问实现相同的源代码?
在实践中你不能。
只有当您拥有一组特殊化时,才能将它们放入库中。 基本模板不能放在那里。
另一方面,使用导出并没有隐藏源。 编译器仍然需要它来从模板中实例化新类。
总之,你不能。 export
关键字是尝试实现类似于非源模板库的尝试失败(尽管甚至没有接近二进制代码实现的混淆程度),并且没有替代。
我经常注意到的一件事是,很多模板代码实际上并不是模板,可以移动到非模板函数。
还发生函数模板特化被视为常规函数:您可以将它们内联定义(并将其标记)或在头中声明它们并在源文件中实现它们。
当然,专业化意味着你知道它将被执行的类型......
请注意,你所要求的是有些对立的。
模板的目标是创建“模式”,以便编译器可以为多种不相关的类型生成类和函数。 如果隐藏此模式,您希望编译器如何能够生成这些类和函数?
您可以在最新的编译器中使用extern模板: http : //en.wikipedia.org/wiki/C%2B%2B0x#Extern_template
但是,它不完美,因为它只限制模板实例化。 我们的想法是将模板声明和实现分成两个单独的文件。
然后,当您需要模板时,首先使用extern模板,以确保它尚未实例化。 然后对于你需要的每个实例化(一个用于std :: vector,一个用于std :: vector等),将实例化放在一个将在唯一cpp中的typedef中。
因为它使代码显然更难理解,所以它还不是最好的解决方案。 但它确实有效:它有助于最小化模板实例化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.