2016-04-27 6 views
2

So habe ich eine Klasse wie folgt:Korrekte Art, Casting in C++ 11 zu schreiben?

A{ 
init(int a){ 
_data.resize(a); //! (1) 
} 
//other code is unimportant 
private: 
std::list<std::vector<double>> _data; 
} 

In (1) i mit Text Warnung bekam: implizite Konvertierung von int zu size_type (aka lange unsigned)

Ich möchte wissen, was die meisten ist richtige Weg, um diese Warnung loszuwerden? Vielleicht so etwas wie folgt aus:

_data.resize(static_cast<decltype(_data)::size_type>(a) 

Anmerkung:

Ich denke, dass dies:

init(size_t a) 

ist der richtige Weg, aber lassen Sie uns annehmen, dass wir nicht Schnittstelle

+8

'init (size_t a) {' –

+0

@Revolver_Ocelot Ich vermute, dass dies der richtige Weg ist, aber lassen Sie uns annehmen, dass wir die Schnittstelle nicht ändern können – tty6

+1

Anstatt etwas zu werfen, scheint es sinnvoller * zu überprüfen * ob das Argument als der Grössen-Typ des Containers darstellbar ist . –

Antwort

7

ändern Ihr Beispiel Cast macht es richtig:

  1. Es explizit angibt, Absicht zu werfen.
  2. Es wandelt in den richtigen Typ um und ist vor zukünftigen Änderungen der Typen _data geschützt.
  3. Es verwendet die richtige Besetzung.

Also bleiben Sie dabei, wenn eine Änderung der Schnittstelle nicht in Frage kommt.

Es wäre gut, vor der Verwendung von Plausibilitätsprüfungen eine Eingabe vorzunehmen. Das Überprüfen auf einen negativen Wert vor dem Umsetzen auf unsigned ist sehr einfach und nützlich.

+1

Ich bin versucht hinzuzufügen: Überprüfen Sie vor dem Cast, ob ein negatives 'a' vorhanden ist. –

+0

@EmilyL. Das ist ein guter Vorschlag, ich füge es dem Beitrag hinzu. –

+0

Sie könnten in numeric_cast von Boost schauen, die die Überprüfung des Bereichs für Sie tun wird –

2

So einfach wie diese:

_data.resize(std::size_t(a)); 

So verrückt wie folgt aus:

_data.resize(static_cast<std::size_t>(a)); 

C-Casts auch unterstützt:

_data.resize((std::size_t)a); 
+3

Als eine Nebenbemerkung, der erste Vorschlag (funktionale Besetzung) und die C-Stil-Besetzung sind zwei Möglichkeiten, um die gleiche Sache zu schreiben. – user2079303

+0

@ user2079303, ich weiß. Die Absicht meiner Antwort war zu zeigen, dass es mehrere Möglichkeiten gibt, dasselbe zu tun. Also los gehts :) – ForceBru

+0

Ich bin sicher, dass du * weißt *. Aber ich bezweifle, dass jeder, der nach dem richtigen Weg sucht * wissen würde. – user2079303

4

Die richtige Art und Weise ist, wie Sie sagen:

_data.resize(static_cast<decltype(_data)::size_type>(a)); 

Aber das große Problem vsunsigned unterzeichnet und Sie sagen, Sie mit int stecken, so dass Sie verwenden:

_data.resize(static_cast<unsigned int>(a)); 
Verwandte Themen