(我可以最小化)我的C ++代码中的模板的足迹吗?

时间:2014-06-25 10:01:16

标签: c++ templates

我有一个大类,它基本上处理一个变量(数字)数据类型的缓冲区。所以使用具有此数据类型的类模板作为唯一参数似乎是一个不错的选择。我没有C ++经验,我对这个模板在我的代码中所做的“足迹”感到担忧/担心。

模板有三个含义,在我的(C ++无经验的)眼中是不必要的并且使代码变得丑陋。我试图避免它们,但我也没有找到一个很好的例子如何做到这一点,也没有我自己找到它。

所以这个问题的目标是:你能否证实以下陈述或给出一个反例?

  1. 使用类模板时,所有类方法都必须进入头文件。即使他们的界面或实现中没有模板化类型。
  2. 当使用静态方法或类的成员时,我总是必须指定模板参数(MyClass< double > :: MY_STATIC),即使模板化不影响类的任何静态属性。
  3. 当使用类作为函数的参数时,我总是必须给出一个模板参数,即使此函数不访问任何模板化成员? (function myFunc(MyClass< double> & myClass){ do something }

2 个答案:

答案 0 :(得分:3)

作为一般规则,不要在模板类中使用不使用模板参数的函数/数据成员。有一个基类,把所有非模板相关的东西放在那里,你的模板类应该从它派生。

回答你的问题:

  • 是的,在您需要实例化模板的任何地方,您需要查看该类的完整定义及其功能
  • 是的,但把它放到基类
  • 是的,见上文
编辑:迁移到基类的原因之一是代码膨胀(这个表达式实际存在,你可以谷歌获取更多信息):如果你不将模板无关的代码移动到基类,将为模板的所有实例化复制完全相同的模板独立代码,这意味着许多不必要的代码。如果你把它放到基类中,你只需要一次这个代码。

答案 1 :(得分:1)

  1. 是。从好的方面来说,只有当metod实际用于专业化时才会生成代码。

  2. 是。但是,如果静态方法没有使用模板化参数,那么静态方法就不需要(除了设计选择之外)。

  3. 是。结构的大小和内存布局由模板参数确定。