2017-03-20 5 views
0

Ich versuche, die maximale Größe für eine Klasse, die ich erstelle, explizit zu begrenzen und habe eine Lösung gefunden, die scheinbar funktioniert, aber hässlich wirkt. Das Beispiel ist etwas erfunden, aber ich würde es gerne wissen, falls die Situation jemals natürlicher erscheint.Überprüfung der C++ Initialisierungslisten-Beschränkung

Hier ist es wie:

PriorityQueue(const unsigned int maxSizeIn) : 
      maxSize((maxSizeIn >= SOME_CONSTANT) ? SOME_CONSTANT - 1 : maxSizeIn), 
      queueArray(new PriorityPair<T>*[maxSizeIn]()), 
      currentHeapSize(0) 
{ 

} 

Die clunkiness kommt in der intializer Liste der ternären Ausdruck aus mit. Während dies funktioniert, sieht es nicht besonders gut aus und zwang mich, jede Komponente der Liste nach Zeilen zu trennen. Ich habe versucht, diese Logik in den Körper des Konstruktors zu verschieben, aber ich stieß auf Probleme, wie ich das versuchte.

Aus Gründen der Klarheit habe ich das Original bearbeitet, um besser hervorzuheben, was ich frage. Das heißt, gibt es eine funktional äquivalente Methode, die sauberer ist, um Einschränkungen für Initialisierungslisten zu setzen.

Was sollte die Lösung für ein solches Problem sein?

+0

Warum kann 'maxSizeIn' nicht gleich' numeric_limits :: max() '? – NathanOliver

+0

@NathanOliver dieser Teil ist beliebig. Ich mache mir mehr Sorgen wegen der Ungeschicklichkeit der ganzen Sache. – Caboose

Antwort

0

würden Sie std::min dafür verwenden:

maxSize(std::min(maxSizeIn, std::numeric_limits<unsigned int>::max() - 1)); 

Hier std::numeric_limits<unsigned int>::max() - 1 auch immer jede konstant sein kann - in Ihrem Beispiel, das SOME_CONSTANT wäre.

Beachten Sie, dass es in Ihrem Fall überhaupt keinen Sinn macht. maxSizeIn kann niemals größer als der Maximalwert seines Typs sein. Wenn jemand eine größere Größe als std::numeric_limits<unsigned int>::max() für Ihren Konstruktor angeben würde, wird diese Person schnell feststellen, dass ihr Argument übergelaufen ist.

Sie könnten stattdessen jedoch eine unsigned long übergeben.

+0

Ich habe den ursprünglichen Beitrag bearbeitet, um besser hervorzuheben, worum es geht. Das Beispiel, mit dem ich ging, war schlecht durchdacht. Ich nehme an, dass std :: min die Lösung etwas kürzer und sauberer machen würde, auch wenn es nur ein Rapper ist. Die Klammern, die Sie nach maxSize haben, ist die gültige Syntax für eine Initializer-Liste? – Caboose

+0

@Caboose Ja, das ist eine C++ 11-Funktion. Ich werde es aber ändern :) – Rakete1111

+0

@Caboose Ihre Klarstellung klärt mich nicht wirklich auf. Sie können 'std :: min' immer noch für' SOME_CONSTANT' verwenden. Du meinst wie kompliziertere Einschränkungen? – Rakete1111

Verwandte Themen