C++ C++;:函数参数或模板参数

C++ C++;:函数参数或模板参数,c++,templates,non-type-template-parameter,C++,Templates,Non Type Template Parameter,我有一个类myclass,它依赖于一些int,比如设置向量成员的大小。 我可以把它作为一个工具来实现 然后简单地使用sz作为构造函数或其他类方法中的参数 这两种方法在很多情况下都有效。在其他一些情况下(例如,如果myclass引用其他模板类或函数,使用sz作为非类型模板参数),则只有第一个选项有效。 如果两者都能起作用,那么选择其中一种或另一种的可能原因是什么? 除了我未来的新编码之外,这也会影响我对一些我已经拥有的代码所做的事情。。。是努力将一种实现“转换”为另一种实现,还是保持现状 我不仅要

我有一个类
myclass
,它依赖于一些
int
,比如设置向量成员的大小。 我可以把它作为一个工具来实现

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

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

除了我未来的新编码之外,这也会影响我对一些我已经拥有的代码所做的事情。。。是努力将一种实现“转换”为另一种实现,还是保持现状

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

首先,重叠(“两者都可以工作的地方”)比你想象的要小得多。您不能为类模板(缺少)的各种专门化创建容器。如果
myclass
是一个模板,任何使用
myclass
作为参数或返回类型的函数都必须命名一个专门化,或者将其自身设置为模板化。仅当大小为常量时,即使是纯本地用法也会重叠


如果这些问题都没有迫使您采取行动,那么也会对性能产生影响。使用类模板的多个实例化可能会增加二进制的大小,尽管积极的内联可能会降低成本。使用运行时参数可能会带来额外的运行时开销,尽管积极的内联可能也会减少这一开销。您也无法避免使用单一类型进行堆分配(除非您设置了一个您始终需要支付的最大容量)。

除了构造函数之外,还有什么需要知道该值的吗?您是否同意影响类型的值?您是否同意该值必须是编译时常量。只是一个元素:
myclass
myclass
是两种不同的类型;非模板
myclass
的两个对象(第一个用
1
初始化,第二个用
2
初始化)是相同类型的对象。没有最好的或最坏的:不同的需求带来不同的解决方案。不是反对者,而是“首选”和“首选”这两个词在没有描述您的特定用例的情况下没有什么意义。我研究了它,几乎给出了我的“意见”作为答案,但经过仔细思考,没有对错之分。如果你阅读了这个问题及其评论,你会得出结论,你可能正在调用UB。(有一点是关于英特尔的某人说有些案例甚至不应该编译)@HolyBlackCat-1)到目前为止,只有构造函数。但我预见到我将来在其他方法中也需要它。2) 我不明白这个问题。3) 你在区分常量和常量表达式吗?如果不是,我不明白这个问题。。。我应该同意该值必须是编译时常量,否则模板化版本将根本无法工作。1)“重叠比您想象的要小”。。。也许,我没有仔细考虑这些选择。2) 有趣的链接问题。仍然需要理解与此OP.3的联系)您的含义(
myclass
是一个模板)+(
f
使用
myclass
)=>(
f
是一个模板或专门化)在逻辑上与我所述的相同(其他
X
模板类或函数使用
sz
作为非类型模板参数)+(
myclass
指的是
X
)=>(
myclass
是一个模板),但以命题(
myclass
是一个模板)作为模板。因此,我想在回答这篇作品时,没有考虑到发病率。4)我必须测试你提到的因素的发病率。谢谢@sancho.srestreatemonicacellio:“我的客户必须被模板化”当然是相关的,因为如果你需要,比如说,被虚拟函数或main调用,它会影响你是否想要你的“类型”被模板化。并非所有的设计都是自下而上的。
template<int sz>
class myclass {
...
class myclass {
...