1

在我的应用程序中,通过为结构引入特殊情况,我获得了大约 2 倍的加速。

简化后,我的代码如下所示:

class SpecialCase
{
   private:
      size_t values[10];
   public:
      void foo();
};

class GenericCase
{
   private:
      std::vector<size_t> values;
   public:
      void foo();
};

template <class Case> void bar()
{
   Case case;
   case.foo();
}

void somewhereElse()
{
   if ( boring_runtime_condition )
   {
      bar<SpecialCase>();
   }
   else
   {
      bar<GenericCase>();
   }
}

这段代码没有问题,但现在我必须通过另一个类来扩展应用程序:

class Problem
{
   private:
      std::vector<Case> cases;
   public:
      Case doSomething();
};

要同时使用 SpecialCase 和 GenericCase,我必须将整个类设为模板。由于我有几个特殊情况,这会大大减慢编译速度。我一点也不喜欢。

我从不在应用程序运行中混合 SpecialCase 和 GenericCase。我非常希望不必在每个方法中都将我的 Case 转换为特定类型,因为它会使代码膨胀,而其他开发人员可能会忘记它。

有没有一种避免这种疯狂模板的好方法?(也欢迎 C++11 解决方案)

免责声明:请不要告诉我有多棒std::vector,我不应该使用特殊情况。我测量了性能,所以请不要发表您不相信 2 倍加速的评论。这是事实,这个问题与它无关。

4

1 回答 1

0

如果您不想创建很多 的实例std::vector,您可以创建一个小型代理类,通过引用存储所有内容并仅在此类中强制转换。如果它很小,则实例化不会太慢。

template<class T>
class Problem {
    private:
        std::vector< some_smart_pointer > cases;
    public:
        T cast(Case* x) {
             return (T*)x;
        }
        T doSomething() {
             //doing something
              return cast(returnValue);
        }
};

我调用了这个类Problem,但是最好制作一些ProxyVector仅用作代理的其他层并在Problem

于 2013-03-09T13:31:59.747 回答