4
나는, 매우 간단하게 몇 가지 코드가 다소 다음과 같습니다 Y::Faa
수동 Y::operator<<
를 지정하는 데 대한 모호한 연산자를 피할 수있는 방법이모호한 연산자 << 선택
#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;
}
있습니까? 그렇지 않다면, 왜?
대한 제한은 매우 약한 것 같다 (너무 많은 유형이 허용됩니다). 예를 들어 수정할 수 있습니까? 유형 특성을 사용하여? – dyp
실제 코드에서는 다양한 멤버 메서드의 존재를 확인하는 실제 특성을 만들었지 만 그 아이디어는 같습니다. 나는 이것이 아직 여기의 문제라고 생각하지 않는다. – Svalorzen
필자는 허용 된 유형의 목록과 같은 것을 생각했습니다. 네임 스페이스의 직접 멤버로 의도 된 유형을 "결정"할 수있는 항목. 그런 다음 'x'라는 멤버가있는 멤버를 선택할 수 있습니다. – dyp