[英]C++ specialized template class for a given type list
我正在编写一种稀疏矩阵实现,实际上有两种不同的实现:一种用于轻型(即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>;
};
这可行,但它不干净, BaseClass中的虚拟化减慢了执行速度......
我想只编写一个模板类,并专门针对几种类型,但我想知道: 是否可以专门针对sizeof(T)
的特定值 (即等效于if (sizeof(T) <= sizeof(int64))
)? 或者是一组可能的类型( template <> class Matrix<arrayOfPossibleTypes>
)?
我想避免为int
, bool
, uint_32
, int32
etc
类型uint_32
类。
有没有人有想法?
PS:或者,我想到一个预编译器宏来选择LightType或HeavyType类,但我认为在#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.