Durchsetzung der Vorlage durch static_assert

Ich versuche zu verstehen, die Nützlichkeit der static_assert, und ich möchte wissen, ob es mir helfen kann bei der Vollstreckung einer design, und wenn ja, wie.

Ich habe eine Allgemeine Vorlage-Klasse, die blendet seine eigene Implementierung in einer anderen template-Klasse, die teilweise spezialisiert, basierend auf der Größe der template-Typ. Hier ein kurzer überblick über das design:

template <class T, size_t S = sizeof(T)>
struct Helper;

template <class T>
struct Helper<T, sizeof(long)>
{
    static T bar();
};

//... other specializations ...

template <class T>
class Foo
{
public:

    T bar()
    {
        return Helper<T>::bar();
    }
};

Foo wird nur unterstützt, wenn die Größe der T wird unterstützt durch eine Spezialisierung Helfer. Zum Beispiel Foo<long> und Foo<unsigned long> werden beide unterstützt. Jedoch angenommen, der Benutzer versucht, zu erstellen eine Foo<bool>. Normalerweise würde dies die Fehler erzeugen, weil die Spezialisierung von Helfer für bool ist nicht definiert, das dazu bestimmt ist, Verhalten.

Gibt es eine Möglichkeit zu nutzen static_assert in diesem design, um mehr hilfreich, die Fehler der Benutzer dieser Schnittstelle?

Darüber hinaus möchte ich auch restric den Benutzer von der Nutzung eines bestimmten Typs, obwohl die Größe richtig sein. Zum Beispiel Foo<float> nicht erlaubt werden sollte. Gerade jetzt, die einzige Möglichkeit, die ich kenne die Durchsetzung dieser wird durch einen Fett Kommentar in der Dokumentation. 🙂

  • Denke generell ist es nur integer-Typen werden unterstützt? Keine char, bool, float, et al?
  • Suche ALSO für eine Vorlage-Typ-Einschränkungen oder "Konzepte". Eine Einrichtung, um dies zu tun entfernt wurde aus C++11 in der letzten minute. Es gibt weniger automatische Möglichkeiten, um ähnliche Ergebnisse erzielen, wenn.
  • char, int, und long zusammen mit Ihren unsigned Versionen sollten unterstützt werden. Der code wäre identisch für int, long, und unsigned long wenn sizeof(int) == sizeof(long) == sizeof(unsigned long).
InformationsquelleAutor Zeenobit | 2013-07-16
Schreibe einen Kommentar