提供特征类的类型的模板特化

时间:2011-07-02 10:25:03

标签: c++ templates

我有一个班级

template <typename T> struct Dispatch;

用于调用特定于类型的函数。例如,假设我有调度员,如

template <> struct Dispatch <MyClass> {
  static void Apply (void* a, MyClass& m)
  {
      ::memcpy (a, &m, sizeof (m));
  }
};

现在我有一堆类,我有一个类型特征,ArrayTypes。我想做点什么:

 template <> struct Dispatch <enable_if<IsArrayType>>
 {
   template <typename ArrayType>
   static void Apply (void* a, ArrayType& m)
   {
     ::memcpy (a, &m, ArrayTypeTraits<ArrayType>::GetSize (m));
   }
 };

这可能吗?

4 个答案:

答案 0 :(得分:4)

使用提升enable_if

如果无法提升,请查看enable_if idiom

答案 1 :(得分:4)

刚刚找到它:

template <typename T, class Enable = void> struct Dispatch;
template <typename T>
struct Dispatch<T, typename boost::enable_if< typename IsArrayType<T>::type>::type>
{
};

感谢Kornel。

答案 2 :(得分:0)

特征背后的想法是,您可以提供默认实现,类型可以选择专门化。这样,在使用特征的代码中没有特殊情况。你的方法(对于有和没有定义特征的类有特殊情况)会破坏类型特征的目的。

答案 3 :(得分:0)

从C ++ 14开始,这被标准化为std::enable_if