Gibt es trotzdem eine Beschränkung der Größe eines Arrays, wenn es als Argument für eine Funktion übergeben wird?
Ich meine, ist etwas so möglich?
%Vor% Ich möchte die Größe meines Arrays mindestens (oder höchstens) n
(n kann einen beliebigen Wert haben).
Zum Beispiel:
Wenn n=20
I muss ein Array mit mindestens (oder höchstens) 20 Elementen übergeben. Gibt es einen Weg in C ++ dafür?
Sie können die Anforderung einfach zu einer statischen Behauptung machen - z. mit Boosts statische Behauptung:
%Vor%Eine grundlegende benutzerdefinierte Implementierung (die das Problem der mehrfachen Verwendung pro Bereich nicht löst) könnte folgendermaßen aussehen:
%Vor% Wenn Sie ein anderes Verhalten wünschen, wenn die Anforderung erfüllt ist, verwenden Sie etwas wie enable_if
oder tagbasierte Spezialisierung. Beispiel mit enable_if
:
Die Antwort von GF ist richtig, wenn Sie zur Kompilierungszeit mehr Funktionen oder Entscheidungspunkte wünschen, sollten Sie sich boost::mpl . C ++ Template Metaprogrammierung beschreibt, was mit boost :: MPL möglich ist und wie es entwickelt wurde. Modernes C ++ - Design , das nicht mit MPL verwandt ist, geht in Designtechniken ein, die den Kompilierungszeitpolymorphismus nutzen
GFs Antwort ist ziemlich cool, aber Boost.Array kann nicht geh ohne Erwähnung.
%Vor% Angesichts Ihrer Frage und der Antwort von GF sieht es so aus, als wäre eine rechenfreie, typen- und bereichssichere implizite Konvertierung von T(&)[20]
nach some_array_template<T,20>
semantisch möglich, aber boost::array
lässt das nicht zu. Dennoch sollten Sie möglicherweise in boost::array
gehen, wenn Sie viele ähnliche Logik haben. Und es ist einfach genug, um als eine Basis zu verwenden, um Ihre eigenen zu rollen, wenn Sie implizite Konvertierung möchten.
Sie versuchen, Vorlagen zu verwenden (Kompilierzeit), um zu wissen, wie viele Elemente sich zur Laufzeit in Ihrem Array befinden. Es ist nicht möglich zu tun, wie du es versuchst.
Sie werden sich auf Code außerhalb Ihrer Funktion oder innerhalb der Funktion
verlassen müssen