Gegeben:Teil Spezialisierung eines Verfahrens in einer Templat-Klasse
struct A
{
virtual bool what() = 0;
};
template<typename T, typename Q>
struct B : public A
{
virtual bool what();
};
ich teilweise wollen spezialisieren what
wie:
template<typename T, typename Q>
bool B<T, Q>::what()
{
return true;
}
template<typename Q>
bool B<float, Q>::what()
{
return false;
}
Aber es scheint, dass dies nicht möglich ist (ist es in C++ 11) so habe ich versucht SFINAE:
template<typename T>
typename std::enable_if<std::is_same<T, float>::value, bool>::type B<T>::what()
{
return true;
}
template<typename T>
typename std::enable_if<!std::is_same<T, float>::value, bool>::type B<T>::what()
{
return false;
}
Dies auch nicht funktioniert, ich habe keine Ahnung, warum, wenn jemand tut? So fand ich this thread und endete mit:
template<typename T, typename Q>
struct B : public A
{
virtual bool what()
{
return whatimpl(std::is_same<T, float>());
}
bool whatimpl(std::false_type)
{
return false;
}
bool whatimpl(std::true_type)
{
return true;
}
};
Diese endgültige Lösung funktioniert, aber warum nicht die enable_if
Technik? Ich bin auch sehr offen für Vorschläge einer saubereren Antwort, die ich noch nicht erlebt habe.
ich vereinfachte meine Beispiele so viel wie möglich - in meinem realen Anwendungsfall what()
nicht WHAT genannt wird und was tatsächlich ein gutes Stück Arbeit, und ich werde will auf einem benutzerdefinierten Typ zu ‚spezialisieren‘, nicht float
.
@Nawaz Ich habe das erkannt, aber das ist nur ein vereinfachter Fall, um zu zeigen, was ich versuche zu tun :) Lesen Sie die letzte Zeile in der Post. – David
_what_ ist keine Template-Methode, um A :: what() zu überschreiben, sollte es eine einzige Nicht-Template-Methode der Klassenvorlage B sein. Sie können keine Nicht-Template-Methode spezialisieren, weder mit enable_if noch mit irgendeiner anderen Technik. Sie können jedoch die gesamte Klasse B spezialisieren – user396672
@ user396672 Dann warum funktioniert das (vollständige Spezialisierung anstelle von partiellen): 'Vorlage <> bool B :: was() { { Rückgabe false; } ' –
David