2011-09-05 1 views
8

İki enum arasında dönüştürmek için bir cast operatörüne aşırı yüklenmenin bir yolu var mı? Benim kodİki enüm arasındaki yükleniciye aşırı yüklenme operatörü

Ben

enum devStatus 
{ 
    NOT_OPERATING, 
    INITIALISING, 
    DEGRADED, 
    NORMAL 
}; 

enum dataStatus 
{ 
    UNAVAILABLE = 1, 
    DEGRADED, 
    NORMAL 
} 

sahip olduğu KULLANILAMIYOR için NOT_OPERATING ve başlangıç ​​durumuna haritası; DÜZELTİLDİ ve NORMAL düz bir şekilde eşleyin. Bunlar harici arayüzlerle sabitlenmiştir.

Ben devStatus ve dataStatus arasında dönüştürmek için bir yol arıyorum ve böyle bir şey yazabilmek istiyorum:

devStatus devSts; 
getDeviceStatus(&devSts); 
dataStatus dataSts = (dataStatus)devSts; 

Bunları sınıflar olsaydı, ben bunu yapmak devStatus::operator dataStatus() yazabilirsiniz biliyoruz. Bunu bir enum için yapmanın bir yolu var mı?

Sadece dönüşüm operatörleri yalnızca sınıf, yapı ve birlik bildirimleri içinde bildirilebilir, C++ ücretsiz bir fonksiyonu dataStatus devStatus2dataStatus(const devStatus& desSts)

cevap

13

olabilir. Tip dışında bildirilemezler (örneğin, operatör + gibi). Enum tipi bildirimleri örnek üyeleri desteklemez, bu nedenle dönüştürme işlevine gitmeniz gerekir. Bunu yapmak da arama kodunu daha net hale getirecektir. Aşağıdaki örnek numaralandırma ve dönüşüm fonksiyonları kapsamına özel ad alanlarını kullanarak bu gösterir:

namespace TheirEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 
} 
namespace MyEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 

    TheirEnum::Type ToTheirEnum (Type e) { 
     switch (e) { 
     case Value1: return TheirEnum::Value1; 
     case Value2: return TheirEnum::Value2; 
     default: throw std::invalid_argument("e"); 
     } 
    } 
} 

// usage: 
TheirEnum::Type e = MyEnum::ToTheirEnum(MyEnum::Value1); 
+0

ne gibi avantajlar/yerine her enum için bir sınıf tanımlama disadvantes ve dönüşüm operatörleri nelerdir? Aşağı yönde daha fazla boilerplate kodu. Dış ad alanının etrafında yüzen hiçbir dönüşüm fonksiyonu yok - yine de enumlar zaten orada etrafında yüzen olduğunu söylemişti. Verimlilik derleyici optimizasyonu ile aynı olmalıdır. –

+0

C++ enums için isim belirleme ideal değildir, ancak her bir enum için bir sınıf oluşturma tavşan delik aşağı gitmek zorunda kalmadan, enum bildirimi ve bir isim alanı ile dönüşüm işlevi sarma tarafından kolayca önlenebilir. Bu yola gitmek, is-a/has-a ilişkisi gibi mantıksal konuları ve hangi işleçlerin tür için sağlaması gerektiğini belirtmektedir. Sanırım bunu yapmak çoğu numara için muhtemelen çok fazla. –

+0

Yanıtı örnek ad alanı beyanı ve örnek kullanımı ile güncelledim. –