Die Größe eines Arrays einschränken, wenn es an eine Funktion übergeben wird

8

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?

    
Prasoon Saurav 29.01.2010, 09:34
quelle

5 Antworten

15

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 :

%Vor%     
Georg Fritzsche 29.01.2010, 09:38
quelle
5

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

    
Hassan Syed 29.01.2010 09:48
quelle
3

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.

    
Potatoswatter 29.01.2010 11:10
quelle
-2

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     
Eric 29.01.2010 09:42
quelle
-3

In C ++ gibt es kein solches Konstrukt, mit dem Sie einen Kompilierzeitfehler erhalten können. Aber ich denke, dass Sie mit Templates ein Framework implementieren können, das etwas wie eine LimitedArray-Klasse anstelle eines einfachen Array-Typs enthält.

    
sergiom 29.01.2010 09:42
quelle

Tags und Links