Bei dem Versuch, this question zu beantworten, wollte ich die Verwendung von enable_if
+ disable_if
vorschlagen, um die Überladung einer Methode basierend auf der Tatsache zu ermöglichen, dass ein Typ (oder nicht) polymorph war.enable_if + disable_if Kombination provoziert einen mehrdeutigen Anruf
Also habe ich eine kleine Testdatei:
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;
}
, die ganz zahm scheint.
jedoch gcc (3.4 ...) Drossel dazu:
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]
Es scheint ziemlich klar zu meinem menschlichen Geist, die verwendet werden, hier überlasten sollte. Ich meine, es scheint klar zu sein, dass ich eine Alternative definiert habe und nur eine Funktion gleichzeitig verwendet werden kann ... und ich hätte gedacht, dass SFINAE dafür sorgen würde, die unnötige Überlastung zu entkräften.
Ich flickte es mit ...
(Ellipse) anstelle von disable_if
und erfordert ein Dummy-zweites Argument ... aber ich bin immer noch interessiert, warum der Compiler auf diesem zu ersticken.
Verdammt! Ich wusste, dass es funktionieren sollte ... –