我将详细概述我的问题以解释我想要实现的目标,如果您想忽略我的问题的细节,问题在最后一段。
我有一个类设计问题,我希望将任何类型的值传递给函数push()
,pop()
这些函数会将传递的值转换为字符串表示形式,该字符串表示形式将附加到类内部的字符串中,从而有效地创建数据流。反过来会发生pop()
,获取流并将流前面的几个字节转换回指定的类型。
制作push()
和pop()
模板绑定stringstream
是一个明显的解决方案。但是,我希望在 DLL 中使用此功能,我可以在其中更改字符串的存储方式(例如加密或压缩),而无需重新编译客户端。T
如果算法发生变化,则需要重新编译类型模板。
我的下一个想法是只使用 , , 等函数pushByte()
。pushInt()
这popByte()
将popInt()
允许我在不重新编译客户端的情况下更改实现,因为它们仅依赖于静态接口。这样就好了。但是,它不是那么灵活。例如,如果一个值从一个字节更改为一个短字节,则与该值对应的所有 pushByte() 实例都需要更改为pushShort()
,popByte()
类似于popShort()
。重载pop()
和push()
解决这个问题会导致类型冲突(导致显式转换,这最终会导致同样的问题)。
有了上面的想法,我就可以创建一个工人阶级了。但是,我想知道如何编译专门的模板。如果我创建push<byte>()
and push<short>()
,这将是一个特定类型的重载,并且从 byte 到 short 的更改会自动切换使用的模板,这将是理想的。
现在,我的问题是,如果我只使用专门的模板来模拟这种重载(没有 type 的模板T
),所有的专门化是否都会编译到我的 DLL 中,从而允许我在不重新编译客户端的情况下调度新的实现?T
还是在客户端编译时以与模板类型相同的方式选择或删除专用模板?