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