我有一个班级
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));
}
};
这可能吗?
答案 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
。