我想知道是否使用模板,在其他线程中,我发现由于某些原因,模板必须在头文件中实现。这是好的,我的问题是,如果其他程序使用它的源码是否需要?从另一个线程的回答逻辑来看,似乎即使是其他程序员也需要完整的实现,以便编译器可以判断一行是否可以使用模板化函数。
如果是这样的话,我想模板对于希望其他人使用他的库的开发人员来说不是一件好事?如果没有,那么我们是好的,模板将被使用。
或者,如果至少有任何方式可以节省我的努力,花费的时间,从别人的代码?
(我将使用stl向量等,但我要求提供我自己的代码...模板看起来不错,省去了很多硬编码行或宏的滥用,但如果其他人能读懂你的源代码,那么打开项目几乎没有任何意义( xD)
谢谢,乔
发布于 2009-10-07 22:05:10
如果您希望库的用户能够使用您的模板,则他们的源代码需要对这些用户可用。
但是,有时您可以设计模板类,使大多数逻辑发生在头文件中没有完整源代码的非模板类中。
发布于 2009-10-07 22:05:55
这取决于您的模板是库接口的一部分,还是仅仅是实现的一部分。
如果它们是接口的一部分(例如,可能入口点返回特定模板类型的对象),那么是的,您需要向外部世界公开您的模板定义。
但是,如果模板只是实现的一部分,那么一旦构建了库,就没有必要与库的使用者共享模板定义。
发布于 2009-10-08 00:25:42
您可以将模板编写为非模板(通常是非类型安全)代码的包装器。
优点是...
明显的缺点是你有一个额外的抽象层和开销,而且非类型安全的实现代码显然需要一些注意。我倾向于在非模板代码中定义一个抽象的“工具”类,专门用于模板包装。我称它为工具,因为方法主要不作用于工具状态,而是作用于作为void*参数传递的对象。tool类将大多数类型不安全问题封装在几个方法中。该模板还提供了用户实际使用的类型安全包装器,该包装器与不安全代码接口,提供工具实例和进行类型转换等。
例如,如果我正在实现一个树数据结构,大多数树算法将是类型不安全的,并且会将节点和数据项视为空*指针(或者可能是节点*和数据*指针,节点和数据被声明但未定义结构)。我将有一个抽象的树工具库,包含用于节点创建、处理和其他基本操作的纯方法,包装器模板将基本上专门化树工具,提供知道节点和数据项的精确类型的方法实现,并将该工具的一个实例作为类成员。对于用户来说,包装器只是一个类型安全容器,与其他容器一样。
顺便说一句--在实现模板包装器时,要注意dependent name问题。
https://stackoverflow.com/questions/1534473
复制相似问题