2013-06-29 17 views
5

Ich habe ein paar Fragen darüber, wie boost::optional funktioniert. Lassen Sie uns dies zuerst tun:Vergleich (<), Ausgabe (<<) und Zuweisung (=) für boost :: optional

boost::optional<int> i; 
  1. Ist i < 3 immer gleichwertig *i < 3 (und ähnlich für andere relationalen Operatoren)?
  2. Stimmt es, dass die Bedingungen i < 3 und *i < 3 nicht definiert sind? (i wurde immer noch nicht eingestellt)
  3. Was soll std::cout << i soll drucken?
  4. Ich bin mir ziemlich sicher, dass i = 3 ist immer das gleiche wie *i = 3. Wenn ja, welche sollte ich bevorzugen?
+1

'i.get()' ist dein Bruder. –

+1

hat Boost seine Dokumentation in den späten Versionen fallengelassen? –

Antwort

9
  1. Nr Wenn i nicht initialisiert ist, wird der erste return true, während der zweite durchsetzen wird.
  2. Nein. Die Dokumentation für operator< zeigt deutlich, dass, wenn das linke Argument nicht initialisiert ist, true zurückgegeben wird, wenn der rechte Operand festgelegt ist.
  3. Es gibt keine operator<< für optional, also nehme ich an, dass es die unspecified-bool-type Konvertierung zurückgibt und 1 oder 0 (wahr/falsch) druckt.
  4. Sie sind nicht das Gleiche. Wenn i nicht initialisiert ist, wird letzteres aktiviert, während ersteres initialisiert und zugewiesen wird. Sie sollten diejenige verwenden, die die von Ihnen gewünschte Semantik angibt.
4

Zu Punkt 3 gibt ist ein Operator < < für boost :: optional in boost/optional/optional_io.hpp erklärt, aber sie sind wahrscheinlich einschließlich nicht. (Wenn Sie boost property_tree verwenden, wird es jedoch für Sie eingeschlossen.) Wenn es eingeschlossen ist, streamt ein leeres optionales als "-" und ein gefülltes optionales streamt ein zusätzliches Leerzeichen und streamt dann den Wert.

Also dieser Code:

#include <boost/optional/optional_io.hpp> 
boost::optional<string> var1 = "value"; 
boost::optional<string> var2; 
cout << " var1 = '" << var1 << "'\n"; 
cout << "*var1 = '" << *var1 << "'\n"; 
cout << " var2 = '" << var2 << "'\n"; 

ergibt dies:

var1 = ' value' 
*var1 = 'value' 
var2 = '--' 

aber der gleiche Code ohne die umfassen Ausbeuten dies, wie von Mark B Antwort vorgeschlagen:

var1 = '1' 
*var1 = 'value' 
var2 = '0' 

That zusätzlicher Raum im ersten Fall hat mich etwas verwirrt.

Verwandte Themen