2009-11-03 18 views
10

bool için bir aynı enum daktilo istenen etki; color_variable == RED formunun karşılaştırmaları, color_variable == 1 formunun karşılaştırmaları Boost.StaticAssert sayesinde derleme zamanı hataları oluşturur. (Bu iyi bir yaklaşım mı?)C++ örtük dönüştürme, ben ancak her şeye karşı çeteleler karşılaştırarak izin vermemek için makro oluşturulan aşırı operatörleri kullanıyorum benim Çeteleler daha türgüvenli yapmak için bir çaba

Ancak, derleyici (CodeGear C++ Builder), örtülü bool dönüşümlerini uygulamak için bu aşırı yüklenmiş operatörleri kullanmaya çalışıyor. Örneğin, if (color_variable) { ... }, if (operator!=(color_variable, 0)) { ... }'a çevriliyor ve BOOST_STATIC_ASSERT'u tetikliyor ve derlenemiyor.

Derleyicimin (Comeau ve GCC'nin bunu yapmadığı gibi) yanlış bir davranış olduğu konusunda kesin olarak eminim ancak onaylayabilecek herhangi bir dil avukatının bulunup bulunmadığını merak ediyordum. Ben C++ 0x taslak standardında kendimi ararken çalıştım ama tek bulabildiğim bölüm 4.12 altında aşağıdaki açıklama şöyleydi: yanlış dönüştürülür

sıfır değeri null işaretçi değeri veya boş eleman işaretçi değeri; diğer herhangi bir değer true değerine dönüştürülür. "Sıfır değerinin" nasıl kontrol edildiğiyle ilgili ayrıntılı bilgi için

.

+2

Daha güvenli bir hale getirmeye çalıştığınız için, örtülü dönüştürmeyi her nasılsa engellemek mantıklı olmaz mıydı? – Grizzly

+0

Bool'a dönüşümü engellemenin iyi bir şey olduğuna karar vermemiştim. Çalıştığım mevcut kod, ener değeri 0'ın yanlış olduğu ve her şeyin doğru olduğu şekilde enumlarını düzenler, böylece bool dönüşümleri meşrudur ve şartlı koşulların okunabilirliğini geliştirebilirler. (Okunabilirlik ve programlama stili büyük olasılıkla ayrı bir sorudur.) –

+0

(Ve örtük dönüşümleri boole izin vermeme karar verirsem, bunu sadece bir derleyicide çalışacak şekilde yapmamayı tercih ederim.) –

cevap

4

Neden aşağıdaki gibi bir sınıf kullanmıyorsunuz?

template<class Enum> 
class ClassEnum 
{ 
public: 
    explicit ClassEnum(Enum value) : value(value) {} 
    inline bool operator ==(ClassEnum rhs) { return value == rhs.value; } 
    inline bool operator !=(ClassEnum rhs) { return value != rhs.value; } 
    inline bool operator <=(ClassEnum rhs) { return value <= rhs.value; } 
    inline bool operator >=(ClassEnum rhs) { return value >= rhs.value; } 
    inline bool operator <(ClassEnum rhs) { return value < rhs.value; } 
    inline bool operator >(ClassEnum rhs) { return value > rhs.value; } 

    // Other operators... 
private: 
    Enum value; 
} 

enum ColorTypeEnum { NO_COLOR, RED, BLUE, GREEN }; 
typedef ClassEnum<ColorTypeEnum> ColorType; 

ClassEnum<ColorTypeEnum> için bool için örtülü hiçbir dönüşüm yoktur.

+0

örtük dönüşümü boole ister. – xryl669