2016-07-08 183 views
0

有一个轻量级类在代码中起着核心作用。实际上,有两种变体(例如,V0V1);都有方法do_it()。此方法在V0V1中大约需要10个浮点运算(FPO)。这是一个很小的数字,但do_it()一直被调用,总体来说这些调用占用了执行时间的30% - 70%。C++:模板的替代解决方案

在我目前的实施V0V1是依赖于他们如此的do_it()正确的变体在编译时决定的所有其他类模板参数。

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

我可以使用C++的其他机制来代替模板吗?任何人都可以估计这种情况下的开销吗?当然,我会好好学习的实际数字,当我重写代码,但是这是一个相当投资

编辑 也让我提供了一个(非常简化的)例子:

假设V0V1是点在二维空间。 V0在一个平面上,并且在球体上有V1do_it()是计算点之间并在V0的情况下的距离的方法是比V1

快得多然后,我有类例如Points<V>其中从std::vector<V>继承,RandomWalk<V>,保持一个参考Points<V>,大量的分析代码等plot_distribution<V>(Points<V>)

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

+0

这是为什么这么烦人?你把所有的东西都放在头文件中吗? –

+0

是的,如果* .hh中的代码为90%。我不喜欢它。 – tnorgd

+2

您可以将方法定义移动到cpp文件,并显式实例化所有内容。对于每个类模板,只需要两个实例,即“someclass '和'someclass '。 –

回答

3

好的旧宏仍然完全可用。

#define NS NS_ ## VARIANT; 

namespace NS 
{ 
    using Variant = VARIANT; 

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

} 

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

+0

我同意* old * ... :-) – skypjack

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>;