我有一堆实现概念A的类,我可以使用一些类确实实现概念A的元函数来检测。让我们说
template <typename T> struct IsA;
IsA<ImplementsA>::value == true;
IsA<AnythingElse>::value == false;
现在有一个概念B.任何类都可以通过专门化适当的特征来实现概念B:
template <typename T> struct BTraits { /* whatever */ };
(当然是为一堆标准类型实现的)
我可以轻松地为任何实现概念A的类专门化BTraits
。但这意味着在整个地方添加特化,并引入我在部分情况下只需要的重依赖。
的常用方法是不,因为基本模板没有默认为void的额外参数。template <typename T> struct BTraits<T, typename enable_if<IsA<T> >::type> { ... }
那么还有其他任何方法可以将BTraits
专门用于那些不需要额外参数的IsA
吗?我可以修改A概念(例如添加基类或其他东西),但我不能修改B概念。
不幸的是我在某些平台上遇到了C ++ 03编译器,所以它必须与C ++ 03兼容(在C ++ 11中,概念B不需要特性,只有很容易的功能)过载)。
答案 0 :(得分:1)
不,没有安全专门化BTraits<T>
的方式,使其成为任何其他T
的更好/最合适的匹配other_trait<T>::value
产生真实。
显式模板特化并不关心某个类型模板参数是否属于某组特定类型。编译器要么看到完全匹配,要么实例化特化,要么它没有;这意味着主模板将被实例化。
当编译器试图找到一个合适的特化项时,它不像在函数调用期间一个对象潜在地,并且隐含地,如果它的潜在基类型可以转换为一个,那个被选中。