Dan*_*k82 5 c++ templates c-preprocessor
我正在编写一种稀疏矩阵实现,实际上有两种不同的实现:一种用于轻型(即sizeof(T) <= sizeof(int64)一种用于重型).
根据sizeof(T),我想实例化相应的类.我首先使用实例化HeavyType或LightType实现的超类进行测试,但是这需要轻量级和重量级来从公共虚拟BaseClass继承,并且泛型调用类以这种方式使用一个或另一个(不是很干净):
template <class T> class Generic{
public:
Generic(){
if (sizeof(T) > TRESHOLDVALUE)
matrix_ = new HeavyType<T>();
else
matrix_ = new LightType<T>();
}
private:
matrix_ * BaseClass<T>;
};
Run Code Online (Sandbox Code Playgroud)
这可行,但它不干净,BaseClass中的虚拟化减慢了执行速度......
我想只编写一个模板类,并将它专门用于几种类型,但我想知道:是否有可能专门针对特定的值sizeof(T)(即相当于if (sizeof(T) <= sizeof(int64)))?或者是一组可能的类型(template <> class Matrix<arrayOfPossibleTypes>)?
我想避免的类重写了int,bool,uint_32,int32,etc类型.
有没有人有想法?
PS:或者,我想到一个预编译器宏来选择LightType或HeavyType类,但我认为sizeof()在#if预编译器语句中使用它是不可能的.
Rei*_*ica 10
你是对的,它不可能sizeof在预处理器指令中使用.并且它不需要,你可以专注于sizeof(T)很好.事实上,你可以专注于sizeof(T) <= sizeof(int64):
template <class T>
class Generic{
private:
MatrixType<T> matrix_;
};
template <class T, bool Light = sizeof(T) <= sizeof(int64)>
struct MatrixType;
template <class T>
struct MatrixType<T, true>
{
//light matrix
};
template <class T>
struct MatrixType<T, false>
{
//heavy matrix
};
Run Code Online (Sandbox Code Playgroud)