2013-06-29 12 views
5

boost::optional'un nasıl çalıştığı hakkında birkaç sorum var. İlk yapalım:Karşılaştırma (<), çıktı (<<) ve atamak için atanma (=) :: isteğe bağlı

boost::optional<int> i; 
  1. hep *i < 3 eşdeğer (ve diğer ilişkisel operatörler için benzer) i < 3 mi?
  2. i < 3 ve *i < 3 koşullarının tanımsız olduğu doğru mu? (i hala hiçbir şey için ayarlanmamıştır)
  3. std::cout << i baskı olması gereken nedir?
  4. i = 3'un her zaman *i = 3 ile aynı olduğundan eminim. Eğer öyleyse, hangisini tercih etmeliyim? i başlatılmamış olduğunu
+1

'i.get()' senin kardeşin. –

+1

, geç sürümlerdeki belgelerini düşürdü mü? –

cevap

9
  1. sayılı Eğer ikinci iddia ise, ilk gerçek dönecektir. operator< belgesi için operator< belgelerine, sol el argümanı başlatılmamışsa, sağa işleneni ayarlandığında true döndüreceğini belirtir.
  2. optional için operator<< yoktur, bu nedenle unspecified-bool-type dönüşümünü döndürüp 1 veya 0 (true/false) yazdıracağını varsayalım.
  3. Onlar aynı değil. i başlatılamıyorsa, ikincisi ilk başlatılırken ve atandığında belirecektir. İstediğiniz semantiği belirten birini kullanmalısınız. noktadan 3 İlişkin
4

, orada bir operatör boost/opsiyonel/optional_io.hpp beyan boost :: opsiyonel için < <, ancak muhtemelen o dahil değildir. (Eğer varsa, property_tree özelliğini arttırırsanız, sizin için dahil edilir.) Eğer eklenirse, boş bir opsiyonel "-" olarak akacak ve isteğe bağlı bir popülasyon ekstra boşluk karakterini aktaracak ve sonra değeri aktaracaktır.

Yani bu kodu:

#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"; 

bu verir:

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

ancak dahil verim olmadan aynı kod Mark B'nin cevap önerdiği gibi:

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

O İlk durumda fazladan boşluk bana biraz karışıklık verdi.

İlgili konular