【问题标题】:C++: Function argument or template parameterC++:函数参数或模板参数
【发布时间】:2021-05-16 13:48:58
【问题描述】:

我有一个类myclass,它依赖于一些int,例如,设置向量成员的大小。 我可以将其实现为non-type template parameter

template<int sz>
class myclass {
...

class myclass {
...

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

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

除了我未来的新编码之外,这也会影响我如何处理我已经拥有的一些代码……是努力将一种实现类型“转换”为另一种,还是保持原样现在。

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

【问题讨论】:

  • 除了构造函数之外还有什么需要知道值的吗?您对影响类型的值是否满意?您是否同意该值必须是编译时常量。
  • 只是一个元素:myclass&lt;1&gt;myclass&lt;2&gt;是两种不同的类型;非模板myclass 的两个对象(第一个用1 初始化,第二个用2 初始化)是相同类型的对象。没有最好或最差:不同的需求带来不同的解决方案。
  • 不是反对者,但如果没有对您的特定用例的描述,“prefer”和“preferable”这两个词几乎没有意义。
  • 我研究了一下,差点给出了我的“意见”作为答案,但仔细想想也没有对错。如果您阅读此问题stackoverflow.com/questions/5979723/… 及其 cmets,您会得出结论,您可能正在调用 UB。 (有一点来自英特尔的人说有些案例甚至不应该编译)
  • @HolyBlackCat - 1) 到目前为止,只有构造函数。但我预见我将来会在其他方法中需要它。 2)我不明白这个问题。 3) 你区分 constantconstant expression 吗?如果不是,我不明白这个问题......我应该可以接受该值必须是编译时常量,否则模板版本根本无法工作。

标签: c++ templates non-type-template-parameter


【解决方案1】:

首先,重叠(“两者都可以工作”)比您想象的要。你不能制作一个包含类模板的各种特化的容器(没有type-erasure tricks)。任何使用myclass 作为参数或返回类型的函数,如果myclass 是模板,则必须命名为specializationtemplated。仅当大小为 constant 表达式时,即使是纯本地用法也会重叠。

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

【讨论】:

  • 1) “重叠比你想象的要小”......也许,我没有详尽地考虑这些选项。 2)有趣的链接问题。还是要理解这个OP的联系。
  • 3) 你的暗示(myclass 是一个模板)+(f 使用myclass)=>(f 是一个模板或专业化)在逻辑上与我所说的相同(其他X 模板化类或函数使用sz 作为非类型模板参数)+(myclass 指的是X)=>(myclass 是一个模板),但带有命题(myclass 是模板)作为premise instead of the conclusion。所以我想在回答这个 OP 时没有考虑到它的发生率。 4)我必须测试你提到的因素的发生率。谢谢!
  • @sancho.sReinstateMonicaCellio:“我的客户必须被模板化”当然是相关的,因为如果你需要,比如说,被虚函数或主函数调用,它会影响你是否想要你的要模板化的“类型”。并非所有设计都是自下而上的。
猜你喜欢
  • 2021-10-18
  • 2017-01-18
  • 1970-01-01
  • 2016-11-18
  • 2021-08-31
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多