ambiguë Tout en essayant de répondre à this question je voulais suggérer l'utilisation de enable_if
+ disable_if
pour permettre la surcharge d'une méthode basée sur le fait qu'un type était (ou non) polymorphes.enable_if + disable_if combinaison provoque un appel
Je créé un petit fichier de test:
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;
}
qui semble tout à fait apprivoisé.
Cependant gcc (3.4 ...) étrangleur sur ce point:
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]
Il semble assez clair à mon esprit humain qui surcharge doit être utilisé ici. Je veux dire qu'il semble clair que j'ai défini une alternative et qu'une seule fonction peut être utilisée à la fois ... et j'aurais pensé que SFINAE prendrait soin d'invalider la surcharge inutile.
Je l'ai patché en utilisant ...
(points de suspension) au lieu de disable_if
et nécessitant un second argument fictif ... mais je suis toujours intéressé par la raison pour laquelle le compilateur s'étouffe.
Damned! Je savais que ça devrait marcher ... –