- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我将详细概述我的问题以解释我要实现的目标,如果您想忽略我的问题的细节,问题在最后一段。
我有一个类设计问题,我希望将任何类型的值传递给 push()
和 pop()
将传递的值转换为字符串表示形式的函数,该表示形式将附加到类中的字符串,从而有效地创建数据流。 pop()
将发生相反的情况,获取流并将流前面的几个字节转换回指定的类型。
制作push()
和 pop()
与 stringstream
绑定(bind)的模板是一个显而易见的解决方案。但是,我希望在 DLL 中使用此功能,在 DLL 中我可以更改字符串的存储方式(例如,加密或压缩),而无需重新编译客户端。 T
类型的模板如果算法发生变化,则需要重新编译。
我的下一个想法是只使用像 pushByte()
这样的函数, pushInt()
, popByte()
, popInt()
等。这将允许我在不重新编译客户端的情况下更改实现,因为它们仅依赖于静态接口(interface)。这样就好了。但是,它不是那么灵活。例如,如果一个值从字节更改为短整型,则与该值对应的所有 pushByte() 实例都需要更改为 pushShort()
。 , 同样适用于 popByte()
至 popShort()
.重载pop()
和 push()
解决这个问题会导致类型冲突(导致显式转换,最终会导致同样的问题)。
有了上面的想法,我可以创建一个 worker 类(Class)。但是,我想知道专门的模板是如何编译的。如果我创建了 push<byte>()
和 push<short>()
,这将是一个类型特定的重载,从 byte 到 short 的变化会自动切换使用的模板,这将是理想的。
现在,我的问题是,如果我只使用专门的模板来模拟这种重载(没有 T
类型的模板),所有的专门化都会编译到我的 DLL 中,从而允许我在无需客户端重新编译的情况下分派(dispatch)新的实现吗?还是以与 T
类型的模板相同的方式选择或删除专用模板?在客户端编译时?
最佳答案
首先,您不能只是没有专门化的基本模板就拥有专门化的模板。这是不允许的。您必须从模板开始,然后才能提供它的特化。
您可以在任意类型集上显式实例化一个模板,并将所有这些实例化编译到您的 DLL 中,但我不确定这是否真的对您有很大帮助。最终,模板基本上是多态性的编译时形式,您似乎需要(至少是有限形式的)运行时多态性。
我可能只会使用重载。我猜你正在谈论的问题是由以下顺序引起的:
int a;
byte b;
a = pop();
b = pop();
您基本上只是在返回类型上重载 pop
(众所周知,这是不允许的)。我会非常简单地避免这种情况——不是返回值,而是传递对要修改的值的引用:
int a;
byte b;
pop(a);
pop(b);
这不仅让重载解析起作用,而且至少对我来说看起来也更干净(虽然也许我只是写了太多的汇编语言,所以我已经习惯了像“pop ax”这样的东西)。
关于C++ 模板特化编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3292145/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!