c++ - 不支持基本模板的概念专用模板

标签 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 */ };

(当然是为一堆标准类型实现的)

我可以轻松专攻BTraits对于任何实现概念 A 的类。然而,这将意味着在所有地方添加特化并引入我只在部分情况下需要的大量依赖项。

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

那么有没有其他方法可以专门化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/

相关文章:

c++ - 网络上的分布式标识符

c++ - 调试断言失败

c++ - 如何在不知道成员类型的情况下检查 SFINAE 是否存在成员?

c++ - 无法从 <brace-enclosed initializer list> 转换

javascript - 如何在 dojo 1.8 中模板化嵌套对象数组?

c++ - 将编译错误消息添加到 SFINAE 宏

c++ - 为什么 SFINAE (enable_if) 不适用于类模板的成员函数?

c++ - 为什么我不能在使用 cygwin 时使用 atoll

c++ - Boost Graph Library : How do I keep a permanant reference to a vertex?(即不受顶点重新编号的影响)

javascript - Meteor 中的动态加载模板