考虑这个(相当)简单的例子:
#include <iostream>
struct Out {
int value;
};
template<class Sink> decltype(auto) operator<<(Sink &&s, Out const &out) {
return out.value > 0? s << out.value : s;
}
struct In {
std::ostream &sink;
template<typename T> In &operator<<(T const &t) {
return sink << t, *this;
}
};
int main() {
In in{std::cout};
in << (1 << Out{3}) << '\n'; // Ok
in << Out{42} << '\n';
// error: use of overloaded operator '<<' is ambiguous
// (with operand types 'In' and 'Out')
}
能解决这样的歧义吗?我们有两个类,每个类都定义了这样一个运算符重载,以将其转发到其内部类型(类由两个不同的人独立设计,另一个人试图在同一个应用程序中使用它们。)我看不到这样的方法可以根据其他运算符重新制定,例如,在这里放弃A
'sfriend operator<<
并尝试转换A
为int
;是没有用的 并且使用某种复杂的 SFINAE 来排除一些重载看起来仍然没有帮助。