【发布时间】:2014-09-12 08:10:51
【问题描述】:
TLDR:见最后一段。
我为几个模板类定义了一个operator&,如下所示:
template <typename T>
struct Class {
Class(T const &t) { }
};
template <typename T_Lhs, typename T_Rhs>
struct ClassAnd {
ClassAnd(T_Lhs const &lhs, T_Rhs const &rhs) { }
};
template <typename T, typename T_Rhs>
ClassAnd<Class<T>, T_Rhs> operator&(Class<T> const &lhs, T_Rhs const &rhs) {
return ClassAnd<Class<T>, T_Rhs>(lhs, rhs);
}
template <typename T0, typename T1, typename T_Rhs>
ClassAnd<ClassAnd<T0, T1>, T_Rhs> operator&(ClassAnd<T0, T1> const &lhs, T_Rhs const &rhs) {
return ClassAnd<ClassAnd<T0, T1>, T_Rhs>(lhs, rhs);
}
int main() {
Class<int> a(42);
Class<double> b(3.14);
auto c = a & b;
}
这很好用。
当我想添加一个 not 操作时会出现问题,该操作仅允许在 and 操作的一侧或另一侧,并且必须返回 ClassAndNot 而不是 ClassAnd 的实例:
template <typename T>
struct ClassNot {
ClassNot(T const &t) : value(t) { }
T value;
};
template <typename T_Lhs, typename T_Rhs>
struct ClassAndNot {
ClassAndNot(T_Lhs const &lhs, T_Rhs const &rhs) { }
};
template <typename T_Lhs, typename T_Rhs>
ClassAndNot<T_Lhs, T_Rhs> operator&(T_Lhs const &lhs, ClassNot<T_Rhs> const &rhs) {
return ClassAndNot<T_Lhs, T_Rhs>(lhs, rhs.value);
}
template <typename T_Rhs>
ClassNot<T> operator!(T_Rhs const &rhs) {
return ClassNot<T_Rhs>(rhs);
}
...
auto c = a & !b;
这导致operator& 采用任意右侧返回ClassAnd 和operator& 采用ClassNot 右侧返回ClassAndNot 之间存在歧义。
问题:
如果std::enable_if 的右侧是ClassNot 中的任何一种类型,如何在此处使用std::enable_if 来禁用第一个operator&?如果一侧是另一侧的模板实例,是否有类似 std::is_same 的东西返回 true?
附言您可以在 ideone 上找到完整的工作示例。
【问题讨论】:
标签: c++ operator-overloading sfinae enable-if