我有一堆实现概念 A 的类,我可以使用一些元函数检测到某个类确实实现了概念 A。假设
template <typename T> struct IsA;
IsA<ImplementsA>::value == true;
IsA<AnythingElse>::value == false;
现在有一个概念 B。任何类都可以通过专门化适当的特征来实现概念 B:
template <typename T> struct BTraits { /* whatever */ };
(当然是为一堆标准类型实现的)
我可以轻松专攻BTraits
对于任何实现概念 A 的类。然而,这将意味着在所有地方添加特化并引入我只在部分情况下需要的大量依赖项。
的常用方法 将不 工作,因为基本模板没有默认为 void 的额外参数。template <typename T> struct BTraits<T, typename enable_if<IsA<T> >::type> { ... }
那么有没有其他方法可以专门化BTraits
对于任何 IsA
那不需要那个额外的论点吗?我可以修改 A 概念(例如添加基类或其他内容),但我不能修改 B 概念。
不幸的是,我在某些平台上坚持使用 C++03 编译器,因此它必须与 C++03 兼容(在 C++11 中,概念 B 不需要特征,只需要易于使用的函数过载)。
最佳答案
不,没有安全的方法来专门化BTraits<T>
以某种方式使其成为任何 T
的更好/最合适的匹配项其他一些other_trait<T>::value
产生 true。
显式模板特化不关心某个类型模板参数是否属于某个类型集。编译器要么看到完全匹配,并实例化特化,要么没有;这意味着 主模板 将被实例化。
当编译器试图找到一个合适的特化来使用时,它不像在函数调用期间那样,如果对象的潜在基本类型可能会隐式地转换为一个对象,那么这个对象就是已选中。
关于c++ - 不支持基本模板的概念专用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23437490/