在我的应用程序中,我通过为结构引入特殊情况获得了大约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倍的评论。这是事实,而这个问题与此无关。
答案 0 :(得分: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
中使用