首页 > 解决方案 > C++:函数参数或模板参数

问题描述

我有一个类myclass,它依赖于一些int设置向量成员的大小。我可以将其实现为非类型模板参数

template<int sz>
class myclass {
...

或者

class myclass {
...

然后sz在构造函数或其他类方法中简单地用作参数。

两者都可以在很多情况下工作。在其他一些情况下(例如,如果myclass引用其他模板类或函数使用sz作为非类型模板参数),则只有第一个选项有效。 在两者都可以工作的情况下,偏爱其中一个的可能原因是什么?

除了我未来的新编码之外,这也会影响我对已有代码的处理方式……是努力将一种实现类型“转换”为另一种,还是保持现状。

我不仅要询问差异(例如,编译时分配与运行时分配),还要询问这些差异如何使一个或另一个选项更可取。

标签: c++templatesnon-type-template-parameter

解决方案


首先,重叠(“两者都可以工作”)比您想象的要小。您不能制作包含类模板的各种特化的容器(缺少类型擦除技巧)。任何myclass用于参数或返回类型的函数,如果myclass是模板,则必须命名一个化或模板化自身。仅当大小是常量表达式时,即使是纯本地使用也会重叠。

如果这些问题都没有强迫您处理,那么也会对性能产生影响。使用类模板的多个实例化可能会增加二进制大小,尽管积极的内联可能会降低成本。使用运行时参数可能会引入额外的运行时开销,尽管积极的内联也可能会减少这种开销。您也无法避免使用单一类型进行堆分配(除非您施加最大容量——您总是为此付费)。


推荐阅读