2011-03-24 25 views
10

这是一个后续问题: Using export keyword with templates分离模板接口和实现在C++

正如原题“出口”的答案中提到已被弃用C++ 0x中,很少由编译器甚至支持C++ 03。鉴于这种情况,人们可以通过什么方式隐藏lib文件中的实际实现,并通过头文件公开声明,以便最终用户可以知道公开的API的签名,但无法访问实现相同的源代码?

回答

7

实际上你不能。

只有当你有一组特定的专业化,你可以把它们放在一个库中。基本模板不能放在那里。

另一方面,使用导出没有隐藏源代码。编译器仍然需要它从模板实例化新的类。

+1

也可以只声明基本模板,在这种情况下,使用未提供专门化的类型实例化是不可能的。 – 2011-03-24 10:15:56

+0

某些专业化基本上是指每种情况下的特殊功能(类似于任何API ......不使用模板的功能)。 – 2011-03-27 16:24:32

+0

Matthieu M:这是否意味着如果我正在使用模板进行开发,我必须将所有开发的源代码公开给用户(阅读第三方)。 Theres没有办法强制知识产权? – 2011-03-27 16:27:01

2

总之,你不能。关键字export是一个尝试实现类似于非源代码模板库的尝试失败的尝试(尽管甚至没有达到二进制代码实现的混淆级别),并且在关闭时没有替换。

1

我经常注意到的一件事情是模板代码的一大块很不实际,所以可以将其移动到非模板函数中。

函数模板特化也被认为是常规函数:您可以将它们定义为内联(并将它们标记为)或将它们声明为标题并在源文件中实现它们。

当然,专业化意味着你知道哪种类型将被执行...

注意,你所要求的是有些对立。

模板的目标是创建一个“模式”,以便编译器可以为多个不相关的类型生成类和函数。如果你隐藏这种模式,你期望编译器能够生成这些类和函数吗?

1

您可以在最近的编译器使用的extern模板:http://en.wikipedia.org/wiki/C%2B%2B0x#Extern_template

然而,这是不完美的,因为它只能限制模板实例。这个想法是你在两个独立的文件中分开模板声明和实现。

然后,当您需要该模板时,首先使用extern模板,以确保它尚未实例化。然后,对于每个需要的实例(一个用于std :: vector,一个用于std :: vector等),将该实例放入一个将在独特cpp中的typedef。

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