专门用于概念的模板,不支持基本模板

时间:2014-05-02 21:48:49

标签: c++ templates sfinae c++03

我有一堆实现概念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。但这意味着在整个地方添加特化,并引入我在部分情况下只需要的重依赖。

template <typename T> struct BTraits<T, typename enable_if<IsA<T> >::type> { ... } 的常用方法是,因为基本模板没有默认为void的额外参数。

那么还有其他任何方法可以将BTraits专门用于那些不需要额外参数的IsA吗?我可以修改A概念(例如添加基类或其他东西),但我不能修改B概念。

不幸的是我在某些平台上遇到了C ++ 03编译器,所以它必须与C ++ 03兼容(在C ++ 11中,概念B不需要特性,只有很容易的功能)过载)。

1 个答案:

答案 0 :(得分:1)

不,没有安全专门化BTraits<T>的方式,使其成为任何其他T的更好/最合适的匹配other_trait<T>::value产生真实。

显式模板特化并不关心某个类型模板参数是否属于某组特定类型。编译器要么看到完全匹配,要么实例化特化,要么它没有;这意味着主模板将被实例化。

当编译器试图找到一个合适的特化项时,它不像在函数调用期间一个对象潜在地,并且隐含地,如果它的潜在基类型可以转换为一个,那个被选中。