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).
InformationsquelleAutor David | 2012-04-23
Schreibe einen Kommentar