在C ++中分离模板接口和实现

时间:2011-03-24 10:03:29

标签: c++ templates c++11 export

这是一个跟进问题: Using export keyword with templates

如原始问题的答案中所提到的,'export'在C ++ 0x中已被弃用,即使对于C ++ 03也很少得到编译器的支持。鉴于这种情况,以何种方式可以隐藏lib文件中的实际实现并仅通过头文件公开声明,以便最终用户可以知道公开的API的签名是什么,但是无法访问实现相同的源代码? / p>

4 个答案:

答案 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中。

因为它使代码显然更难理解,所以它还不是最好的解决方案。但它确实有效:它有助于最小化模板实例化。