给定类型列表的C++专用模板类

Dan*_*k82 5 c++ templates c-preprocessor

我正在编写一种稀疏矩阵实现,实际上有两种不同的实现:一种用于轻型(即sizeof(T) <= sizeof(int64)一种用于重型).

根据sizeof(T),我想实例化相应的类.我首先使用实例化HeavyTypeLightType实现的超类进行测试,但是这需要轻量级和重量级来从公共虚拟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:或者,我想到一个预编译器宏来选择LightTypeHeavyType类,但我认为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)