Partielle Spezialisierung einer Methode in einer Vorlage gebildete Klasse
Gegeben:
struct A
{
virtual bool what() = 0;
};
template<typename T, typename Q>
struct B : public A
{
virtual bool what();
};
Möchte ich teilweise 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?) also versuchte ich 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;
}
Diese auch nicht funktioniert, ich habe keine Ahnung warum aber, hat jemand? Also ich fand dieser 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 Letzte Lösung funktioniert, aber nicht warum das enable_if
- Technik-Arbeit? Ich bin auch sehr offen für Vorschläge, die eine saubere Antwort, die ich noch nicht gestoßen noch.
Vereinfachte ich die Beispiele soweit wie möglich - in meiner realen Anwendungsfall what()
nicht genannt was und tatsächlich ein gutes Stück Arbeit, und ich ' ll möchten 'spezialisiert' auf einen benutzerdefinierten Typ, nicht float
.
- Ich habe das bewußt, aber das ist nur eine vereinfachte Fall zu zeigen, was ich versuche zu tun 🙂 Lesen Sie die Letzte Zeile in der post.
- was nicht template-Methode zu überschreiben::what() sollte es ein nicht-template-Methode der Klasse Vorlage B. Sie können nicht spezialisiert nicht-template-Methode, weder mit enable_if noch mit irgendeiner anderen Technik. Sie können jedoch spezialisieren sich die ganze Klasse B
- Warum dann nicht diese Arbeit (vollständige Spezialisierung statt der partiellen):
template<> bool B<float, float>::what() { return false; }
- Interessant (BTW +1 für die Frage) scheint, dass ich falsch bin. Ich denke, der Grund, warum dies nicht funktioniert ist, dass partielle Spezialisierung ist nicht zulässig, Funktionen (wie der standard sagt).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Partielle Spezialisierung ist ausdrücklich erlaubt, von der Norm nur für Klassen-templates (siehe 14.5.5 Klasse Vorlage partielle Spezialisierungen)
Für die Mitglieder der Klasse-Vorlage nur explizite Spezialisierung erlaubt ist.
14.7 (3) sagt:
Einer expliziten Spezialisierung erklärt werden kann für eine Funktion template, eine Vorlage-Klasse, ein Mitglied einer Klasse
Vorlage oder ein Mitglied Vorlage. Eine explizite Spezialisierung-Deklaration wird eingeleitet von template<>.
So dass jede definition, beginnend mit
ist nicht erlaubt syntax für die Klasse Vorlage Spezialisierung.
[Bearbeiten]
Als auf SFINAE Versuch, der fehlgeschlagen ist, weil eigentlich gibt es weder überlastungen noch Spezialisierungen hier (SFINAE arbeitet, während Sie eine Reihe von Kandidaten-Funktionen für überlast Auflösung oder bei der Wahl der richtigen Spezialisierung). was() ist deklariert als einzige Methode der Klasse Vorlage und sollte eine einheitliche definition und diese definition sollte die form haben:
oder können auch explizit spezialisiert für bestimmte Instanziierung der Klasse B:
Alle anderen Formen sind syntacticaly unwirksam sein, so SFINAE nicht helfen kann.
Warum nicht einfach es zu ändern..
what()
Zwei mögliche Lösungen, je nach Anwendungsfall:
P. S. ich versuche, fügen Sie den code hier direkt, aber es gibt einige Formatierungs-problem. Wenn mir jemand helfen könnte mit dem hinzufügen der formatierten code aus Coliru es würde groß sein.