2015-07-09 20 views
7

Böyle bir destek :: varyantı Var tanımladık: örneği ancak başlatılmamış zamanYükseltme :: varyant değişkeninin boş olup olmadığı nasıl belirlenir?

boost::variant<boost::blank, bool, int> foo; 

Bu değişken, tip boost::blank arasında bir değere sahiptir, boost::blank şablonu boost :: geçirilen ilk tip olduğu varyant. Bir noktada

, ben foo başlatıldı olmadığını bilmek istiyorum. Bunu denedim, ama hiçbir iyi sonuçlarla ettik:

if (foo) //doesn't compile 
if (foo != boost::blank()) //doesn't compile 
if (!(foo == boost::blank())) //doesn't compile 

Ben fark değer olduğunu düşünüyorum, foo başlatıldı zaman, olabilir foo = boost::blank(); yaparak "reset" (örneğin, foo = true.).

foo'un başlatılmış olup olmadığını nasıl kontrol edebilirim, yani boost::blank'dan farklı bir türü var mı?

+3

'foo.which() == 0' –

+2

'bool const is_blank = boost :: olsun (& foo)' – pmed

+0

@PiotrS. işe yarıyor ama nedenini anlamıyorum. Detaylandırmaya özen gösterilsin mi? – FerranMG

cevap

6

İlk tür, foo.which() == 0 "aktif" olduğunda. Bunu kullan.

İade: *this ait içerdiği Çeşidi sınırlı tiplerinin kümesi haline sıfır tabanlı dizini. (A std::string içeren variant<int, std::string> nesne çağırdı Örneğin, which()1 dönecekti.)

(http://www.boost.org/doc/libs/1_58_0/doc/html/boost/variant.html#idp288369344-bb)

+2

çalışır Bu, ama sonunda sorunların nedeni olabilir eğer 'artırmak :: variant' tanım değişiklikleri türleri hiç sipariş.Her zaman pratik olarak gayet iyi çalışacaktır (daha çok değişkeni, ne zaman değişkenin ne tür "boost :: blank" türünde olduğunu tespit etmeye çalışıyorum, bu da ilk tür olarak daha fazla anlam ifade eder), fakat bence: foo.which() == 0 'kadar ucuz olsaydı, (& foo) 'yi daha eksiksiz bir çözüm olurdu. Ne yazık ki, varsayımsal problemler ya da gerçek yükler arasında seçim yapmak zorunda kalacağım, bu yüzden muhtemelen hangisini kullanacağım. – FerranMG

+2

+1 ve kabul etti. Yine de benim cevabımdaki ziyaretçi yaklaşımını gösterdim, çünkü bunun gibi endişeler genellikle korkudan kaynaklanıyor. Ve korku deneyimsizlikten kaynaklanıyor. Ziyaretçilerin göz korkutucu olmaları gerekmiyor :) – sehe

7

Sen 'blankness' algılamak için bir ziyaretçiyi tanımlayabiliriz:

struct is_blank_f : boost::static_visitor<bool> { 
    bool operator()(boost::blank) const { return true; } 

    template<typename T> 
    bool operator()(T const&) const { return false; } 
}; 

şöyle kullanın:

bool is_blank(my_variant const& v) { 
    return boost::apply_visitor(is_blank_f(), v); 
} 
+0

Bu çözümü beğendim çünkü tamamlandı, ama benim kullanım durumum için bir ziyaretçinin arayacağı ek yükten kaçınmam gerekecek. Bunun için teşekkürler. – FerranMG

+4

@FerranMG Bahis: Bu ek yük eklemez. Optimizasyonların etkin olmasını sağlayın. – sehe

+2

Oluşturulan derlemeden (clang 3.6 ve gcc 5.x) tahmin ederek, '0 == hangi() 'kontrolünü kazanır gibi görünüyor. Karşılaştırma için çalıştı, ancak hangi ölçümlerde yararlı ölçümler almak zordu: https://github.com/rmartinho/nonius/issues/20 – sehe

İlgili konular