C ++:模板的替代解决方案

时间:2016-07-08 09:41:21

标签: templates c++11

有一个轻量级的类在代码中扮演核心角色。实际上,有两种变体(例如V0V1);两者都有方法do_it()。此方法在V0中占用大约10个浮点运算(FPO),在V1中大约需要20个FPO。这是一个很小的数字,但do_it()一直被调用,总体来说这些调用需要30% - 70%的执行时间。

在我当前的实现中,V0V1是依赖于它们的所有其他类的模板参数,因此在编译时会确定do_it()的正确变体。

问题基本上是代码中的任何类使用V或使用使用V的类,因此实际上所有类都是模板。随着时间的推移,它变得有点烦人,难以维护。

我可以使用哪种其他C ++机制代替模板?任何人都可以估计这种情况的开销吗?当然,当我重写代码时,我将学习实际的数字,但这是一项非常重要的投资

修改 我还提供一个(非常简化的)例子:

我们说V0V1是2D空间中的点。 V0位于一个平面上,V1位于一个球体上。 do_it()是计算点之间距离的方法,在V0的情况下,V1Points<V>

快得多

然后我有课程,例如std::vector<V>继承自RandomWalk<V>Points<V>,其中包含对plot_distribution<V>(Points<V>)的引用,许多分析代码,如Shared Numbervar array intarr; intarr:=intarr+Databasefield; databasefield 等。

也许在未来的某个时刻,用户将被允许提供他们自己的几何,例如一个圆环。但是现在只允许两种几何形状,它们不会同时出现在程序中。

2 个答案:

答案 0 :(得分:3)

好的旧宏仍然可以完全使用。

#define NS NS_ ## VARIANT;

namespace NS 
{
  using Variant = VARIANT;

  class Foo
  {
    Variant* v;
    // etc
  };
  // everything goes here

}

现在编译整个项目两次,一次使用-DVARIANT = V0,一次使用-DVARIANT = V1。没有开销!

答案 1 :(得分:0)

如果您知道模板参数仅限于某些类(例如V0V1),那么您可以将所有模板代码移至 .cpp 文件中正常,并将其链接如下...

标题(.h)

template<class T>
class Foo
{
public:
   void Do();
};

实施(.cpp)

template<class T>
void Foo::Do()
{
   ///do stuff...
}

//this creates two entries in the object code for link time resolution of Foo<V0> and Foo<V1> but Foo<anything else> will fail to link
template class Foo<V0>;
template class Foo<V1>;