可以通过定义一个额外的模板函数,在其中使用SFINAE和boost::operators运算符,来避免二义性。
例如,在下面的示例中,我们尝试使用SFINAE和boost::operators运算符“<,” “==”,来比较两个复数(Complex)的模长:
#include
template
T sqr(T x) { return x * x; }
template
struct Complex : boost::additive>,
boost::equality_comparable> {
T x, y;
Complex(T x = 0, T y = 0) : x(x), y(y) {}
T mod() const { return sqr(x) + sqr(y); }
bool operator<(const Complex& c) const {
return mod() < c.mod(); // 模长比较
}
bool operator==(const Complex& c) const {
return x == c.x && y == c.y;
}
};
template
typename std::enable_if::value,
bool>::type
is_zero(T x) {
return std::fabs(x) < 1e-9;
}
template
typename std::enable_if::value,
bool>::type
is_zero(T x) {
return x == 0;
}
template
bool operator==(const Complex& a, const Complex& b) {
return is_zero(a.x - b.x) && is_zero(a.y - b.y);
}
int main() {
Complex a(3, 4), b(4, 3);
if (a < b) printf("YES\n");
if (a == b) printf("NO\n");
if (a != b) printf("YES\n");
return 0;
}
在上面的代码中,我们首先定义了一个Complex结构体,它使用boost::operators运算符“<,” “==”,来比较两个复数(Complex)的模长。
为了