C++ 模板特化编译

标签 c++ dll templates compilation specialization

我将详细概述我的问题以解释我要实现的目标,如果您想忽略我的问题的细节,问题在最后一段。

我有一个类设计问题,我希望将任何类型的值传递给 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/

相关文章:

c++ - 具有静态方法的模板专用类是否占用存储空间?

c++ - Direct3D11 缓冲区对齐要求

c++ - 在 Windows 上分发( native C++)库

c++ - FFMPEG I/O 的自定义读取功能

c++ - 问题 - TCHAR 作为 LPARAM 到属于另一个进程/线程的窗口

c++ - 编译器如何处理外部变量

c++ - C++中的函数地址文字在哪里?

c++ - 基于 bool 模板参数的启用方法

c++ - openGL - 了解闪电引起的颜色变化

c++ - 不可变 vector 的不可变子 vector