У меня есть некоторый код, который, очень упрощенная, выглядит примерно так:Неоднозначный оператор << выбор
#include <iostream>
#include <type_traits>
namespace X {
struct Foo {int x;};
struct Bar {int x;};
template <typename T , typename = typename std::enable_if<
std::is_same<decltype(T::x),int>::value
>::type>
std::ostream & operator<<(std::ostream & os, const T&) {
return os;
}
}
namespace Y {
struct Faa : X::Foo {int y;};
struct Baz {int x; int y;};
template <typename T , typename = typename std::enable_if<
std::is_same<decltype(T::x),int>::value &&
std::is_same<decltype(T::y),int>::value
>::type>
std::ostream & operator<<(std::ostream & os, const T&) {
return os;
}
}
int main() {
// Everything is ok
X::Foo x;
std::cout << x;
Y::Baz k;
std::cout << k;
// Problems..
Y::Faa y;
// std::cout << y; // <--operator is ambiguous
Y::operator<<(std::cout, y);
return 0;
}
Есть ли способ, чтобы избежать неоднозначного оператора для Y::Faa
и необходимости вручную указать Y::operator<<
? Если нет, то почему?
Ограничение, налагаемое через 'enable_if' кажется довольно слабым (слишком много типов допускается). Можете ли вы их уточнить, например? используя черту типа? – dyp
В моем фактическом коде я сделал фактическую черту, которая проверяет существование различных методов-членов, но идея такая же. Я не думаю, что это все еще проблема. – Svalorzen
Я скорее подумал о чем-то вроде списка разрешенных типов; что позволяет «определять», какие типы (предназначены как) непосредственные члены пространства имен. Из этого вы можете выбрать те, у которых есть член с именем 'x'. – dyp