繁体   English   中英

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

[英]C++ specialized template class for a given type list

我正在编写一种稀疏矩阵实现,实际上有两种不同的实现:一种用于轻型(即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>;
};

这可行,但它不干净, BaseClass中的虚拟化减慢了执行速度......

我想只编写一个模板类,并专门针对几种类型,但我想知道: 是否可以专门针对sizeof(T)的特定值 (即等效于if (sizeof(T) <= sizeof(int64)) )? 或者是一组可能的类型( template <> class Matrix<arrayOfPossibleTypes> )?

我想避免为intbooluint_32int32 etc类型uint_32类。

有没有人有想法?

PS:或者,我想到一个预编译器宏来选择LightTypeHeavyType类,但我认为在#if预编译器语句中使用sizeof()是不可能的。

你是对的,因为在预处理器指令中不可能使用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
};

这个问题的一个解决方案是std::enable_if (如果你使用的是C ++ 11)或boost::enable_if (如果你使用的是旧标准)。 您可以向模板添加额外的虚拟模板参数:

template <class T, typename Enable = void> class Generic;

template <class T>
class Generic<T, typename boost::enable_if_c<sizeof(T) > TRESHOLDVALUE>::type>
{
    // implementation for "heavy" class
    HeavyType<T> matrix_;
};

template <class T>
class Generic<T, typename boost::disable_if_c<sizeof(T) > TRESHOLDVALUE>::type>
{
    // implementation for "light" class
    LightType<T> matrix_;
};

如果你真的需要为“轻”和“重”做一个不同的实现,这将是最好的。 如果您要做的只是更改matrix_成员的类型,并且所有其余的实现保持不变,那么您可以使用std::conditional (或其Boost等效, boost::mpl::if_c ) 。

使用std::conditional ,您可以执行以下操作:

template <class T> class Generic{
public:
    using MatrixType = typename std::conditional<(sizeof(T) > TRESHOLDVALUE), HeavyType<T>, LightType<T>>::type;
 Generic() {}
private:
 MatrixType  matrix_;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM