【发布时间】:2010-07-20 16:23:48
【问题描述】:
我将详细概述我的问题以解释我想要实现的目标,如果您想忽略我的问题的细节,问题在最后一段。
我有一个类设计问题,我希望将任何类型的值传递给 push() 和 pop() 函数,这会将传递的值转换为字符串表示形式,该字符串表示形式将附加到类,有效地创建数据流。 pop() 会发生相反的情况,获取流并将流前面的几个字节转换回指定的类型。
将push() 和pop() 模板与stringstream 绑定是一个明显的解决方案。但是,我希望在 DLL 中使用此功能,我可以在其中更改字符串的存储方式(例如加密或压缩),而无需重新编译客户端。如果算法发生变化,则需要重新编译 T 类型的模板。
我的下一个想法是只使用 pushByte()、pushInt()、popByte()、popInt() 等函数。这将允许我在不重新编译客户端的情况下更改实现,因为它们仅依赖于静态界面。这样就好了。但是,它不是那么灵活。例如,如果一个值从一个字节更改为一个短字节,则与该值对应的所有 pushByte() 实例都需要更改为 pushShort(),popByte() 也需要更改为 popShort()。重载 pop() 和 push() 来解决这个问题会导致类型冲突(导致显式转换,最终会导致同样的问题)。
有了上面的想法,我可以创建一个工人阶级。但是,我想知道如何编译专门的模板。如果我创建了push<byte>() 和push<short>(),这将是一个特定类型的重载,并且从字节到短的更改会自动切换使用的模板,这将是理想的。
现在,我的问题是,如果我只使用专门的模板来模拟这种重载(没有 T 类型的模板),是否所有的专门化都可以编译到我的 DLL 中,从而允许我在不重新编译客户端的情况下分派新的实现?还是在客户端编译时以与 T 类型的模板相同的方式选择或删除专用模板?
【问题讨论】:
-
一些来自 Herb Sutter 的模板专业化和重载的指针。 gotw.ca/gotw/049.htm
-
为什么重载需要在用户切换类型时显式转换?
-
如果我将一个short传递给一个用push(byte)、push(short)和push(int)重载的函数,这不会导致从push(short)和push(short)中选择哪个函数的冲突推(int)?一个短的可以传递到任何一个并且是有效的。
-
没问题,
push(short)是更好的匹配。顺便说一句,您可以对内联代码使用反引号 - 请参阅我的编辑。 -
@Charlie Wilkinson:如果给出了多种可能性,大多数编译器都会选择声明的类型。但是有些(比如我相信的 VS)需要调用者进行显式转换。
标签: c++ dll templates compilation specialization