this question에 답하려고 시도하는 동안 유형이 다형성 이었는지 여부에 따라 메소드 오버로드를 허용하려면 enable_if
+ disable_if
을 사용하고 싶습니다. 아주 순종하는 것enable_if + disable_if 조합을 사용하면 모호한 호출이 발생합니다
template <class T>
void* address_of(T* p,
boost::enable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return dynamic_cast<void*>(p); }
template <class T>
void* address_of(T* p,
boost::disable_if< boost::is_polymorphic<T> >* dummy = 0)
{ return static_cast<void*>(p); }
struct N { int x; };
int main(int argc, char* argv[])
{
N n;
std::cout << address_of(&n) << std::endl;
return 0;
}
:
그래서 나는 작은 테스트 파일을 만들었습니다.그러나 GCC이에 (3.4 ...) 초크 :
test.cpp: In function
int main(int, char**)
:
test.cpp:29: error: call of overloadedaddress_of(N*)
is ambiguous
test.cpp:17: note: candidates are:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)
[with T = N]
test.cpp:20: note:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)
[with T = N]
그것은 여기 사용해야 과부하 내 인간의 마음에 오히려 명확한 것 같다. 나는 대안을 정의했고 한 번에 하나의 기능 만 사용할 수 있다는 것이 분명해 보인다. SFINAE가 불필요한 과부하를 무효화 할 것이라고 생각했을 것이다.
disable_if
대신 ...
(줄임표)를 사용하여 패치를 적용하고 더미 두 번째 인수가 필요합니다 ...하지만 여전히 컴파일러가이 문제에 대해 궁금한 점이 있습니다. enable_if의 "반환 형식"버전을 사용
저주를! 나는 그것이 작동해야한다는 것을 알았다. .. –