【发布时间】:2021-05-16 13:48:58
【问题描述】:
我有一个类myclass,它依赖于一些int,例如,设置向量成员的大小。
我可以将其实现为non-type template parameter
template<int sz>
class myclass {
...
或
class myclass {
...
然后在构造函数或其他类方法中简单地使用sz作为参数。
在很多情况下两者都可以。在其他一些情况下(例如,如果myclass 使用sz 作为非类型模板参数引用其他模板化类或函数),则只有第一个选项有效。
在两者都可以工作的情况下,选择其中一个的可能原因是什么?
除了我未来的新编码之外,这也会影响我如何处理我已经拥有的一些代码……是努力将一种实现类型“转换”为另一种,还是保持原样现在。
我不仅要询问差异(例如,编译时分配与运行时分配),还要询问这些差异如何使一个或另一个选项更可取。
【问题讨论】:
-
除了构造函数之外还有什么需要知道值的吗?您对影响类型的值是否满意?您是否同意该值必须是编译时常量。
-
只是一个元素:
myclass<1>和myclass<2>是两种不同的类型;非模板myclass的两个对象(第一个用1初始化,第二个用2初始化)是相同类型的对象。没有最好或最差:不同的需求带来不同的解决方案。 -
不是反对者,但如果没有对您的特定用例的描述,“prefer”和“preferable”这两个词几乎没有意义。
-
我研究了一下,差点给出了我的“意见”作为答案,但仔细想想也没有对错。如果您阅读此问题stackoverflow.com/questions/5979723/… 及其 cmets,您会得出结论,您可能正在调用 UB。 (有一点来自英特尔的人说有些案例甚至不应该编译)
-
@HolyBlackCat - 1) 到目前为止,只有构造函数。但我预见我将来会在其他方法中需要它。 2)我不明白这个问题。 3) 你区分 constant 和 constant expression 吗?如果不是,我不明白这个问题......我应该可以接受该值必须是编译时常量,否则模板版本根本无法工作。
标签: c++ templates non-type-template-parameter