我正在制作一些模板数值数组类,以便于进行数学运算。例如,您可以执行以下操作,从线性值到dB:
buf = 10 * buf.log10();
我想改变" log10"等方法。到以DspBuffer引用作为参数的非成员模板函数。在美学上我觉得这样会好很多,因为之前的代码看起来像这样:
buf = 10 * log10(buf);
这种方法的唯一问题是某些类继承自DspBuffer,如FixedPtDspBuffer(使用定点数据类型时)和ComplexDspBuffer(适用于复杂值)。我有时需要重载函数,并且我不确定我是否可以使用非成员模板函数执行此操作。例如,使用log10()和固定点我想舍入底层log10结果的结果,而不是隐式地执行" floor"转换回固定点时。
我可以通过使非成员模板函数更具体来重载它们(即一个采用DspBuffer,一个采用继承自DspBuffer的FixedPtDspBuffer),还是注定要失败?
答案 0 :(得分:1)
您当然可以为免费功能提供重载,例如log10
分别使用DspBuffer&
或FixedPtDspBuffer
等等。但是,除非您的本地代码知道它正在处理子类,模板与否,不会调用那些重载。因此,相当于虚方法调用的自由函数将始终调用所选的基类重载。
获取虚拟样式调度的一种方法是在自由函数调用的对象上实现虚方法。如果需要,您可以将方法标记为protected或private,将该函数标记为朋友。 Python实际上做了很多这样的事情,实际上,使用len(obj)
这样的免费函数调用会调用obj.__length__()
。
(我认为这在架构上类似于Jarod42建议的访问者模式,但它并不代表接受和访问的名称。)