SORU
20 EKİM 2008, PAZARTESİ


Hangi Typesafe Numaralama C kullanıyorsunuz?

-Dahili C çeteleler typesafe olmadığı bilinen bir şeydir. Uygulama typesafe çeteleler orada kullanılan merak ediyordum... Ben aşağıda kendime "bisiklet", ama biraz ayrıntılı ve sınırlı

typesafeenum.h:

struct TypesafeEnum
{
// Construction:
public:
    TypesafeEnum(): id (next_id  ), name("") {}
    TypesafeEnum(const std::string& n): id(next_id  ), name(n) {}

// Operations:
public:
    bool operator == (const TypesafeEnum& right) const;
    bool operator != (const TypesafeEnum& right) const;
    bool operator < (const TypesafeEnum& right) const;

    std::string to_string() const { return name; }

// Implementation:
private:
    static int next_id;
    int id;
    std::string name;
};

typesafeenum.cpp:

int TypesafeEnum::next_id = 1;

bool TypesafeEnum::operator== (const TypesafeEnum& right) const 
{ return id == right.id; }

bool TypesafeEnum::operator!= (const TypesafeEnum& right) const 
{ return !operator== (right); }

bool TypesafeEnum::operator< (const TypesafeEnum& right) const  
{ return id < right.id; }

Kullanımı:

class Dialog 
{
 ...
    struct Result: public TypesafeEnum
    {
        static const Result CANCEL("Cancel");
        static const Result OK("Ok");
    };


    Result doModal();
 ...
};

const Dialog::Result Dialog::Result::OK;
const Dialog::Result Dialog::Result::CANCEL;

Ayrıca: Gereksinimleri hakkında daha özel olması gerektiğini düşünüyorum. Onları özetlemeye çalışacağım:

Öncelik 1: bir numaralandırma değişkeni geçersiz bir değere Ayarlama mümkün (derleme zamanı hatası) herhangi bir istisna ile.

Öncelik 2: bir int/numaralama değeri tek açık bir fonksiyon ile mümkün olmalıdır Dönüştürme/yöntemi.

Öncelik 3: mümkün olduğunca kompakt, şık ve rahat bildirimi ve kullanımı

Öncelik 4: ve dizelere Dönüştürme numaralandırma değerleri.

(Güzel) Olasılık numaralandırma değerleri üzerinde yineleme yapmak için. öncelik 5:

CEVAP
13 Ocak 2009, Salı


Şu anda yaklaşık Boost ile oynuyorum.Boost Vault teklif (enum_rev4.6.zip filename) numaralama. Asla resmi olarak Destek içine dahil edilmesi için teslim olmasına rağmen, kullanışlı olduğu gibi. (Belgeleri eksik ama açık kaynak kodu ve iyi testleri ile oluşmaktadır.)

Boost.Numaralama böyle bir numaralama bildirimini sağlar:

BOOST_ENUM_VALUES(Level, const char*,
    (Abort)("unrecoverable problem")
    (Error)("recoverable problem")
    (Alert)("unexpected behavior")
    (Info) ("expected behavior")
    (Trace)("normal flow of execution")
    (Debug)("detailed object state listings")
)

Ve otomatik olarak genişletmek için var:

class Level : public boost::detail::enum_base<Level, string>
{
public:
    enum domain
    {
        Abort,
        Error,
        Alert,
        Info,
        Trace,
        Debug,
    };

    BOOST_STATIC_CONSTANT(index_type, size = 6);

    Level() {}
    Level(domain index) : boost::detail::enum_base<Level, string>(index) {}

    typedef boost::optional<Level> optional;
    static optional get_by_name(const char* str)
    {
        if(strcmp(str, "Abort") == 0) return optional(Abort);
        if(strcmp(str, "Error") == 0) return optional(Error);
        if(strcmp(str, "Alert") == 0) return optional(Alert);
        if(strcmp(str, "Info") == 0) return optional(Info);
        if(strcmp(str, "Trace") == 0) return optional(Trace);
        if(strcmp(str, "Debug") == 0) return optional(Debug);
        return optional();
    }

private:
    friend class boost::detail::enum_base<Level, string>;
    static const char* names(domain index)
    {
        switch(index)
        {
        case Abort: return "Abort";
        case Error: return "Error";
        case Alert: return "Alert";
        case Info: return "Info";
        case Trace: return "Trace";
        case Debug: return "Debug";
        default: return NULL;
        }
    }

    typedef boost::optional<value_type> optional_value;
    static optional_value values(domain index)
    {
        switch(index)
        {
        case Abort: return optional_value("unrecoverable problem");
        case Error: return optional_value("recoverable problem");
        case Alert: return optional_value("unexpected behavior");
        case Info: return optional_value("expected behavior");
        case Trace: return optional_value("normal flow of execution");
        case Debug: return optional_value("detailed object state listings");
        default: return optional_value();
        }
    }
};

Liste hangi öncelikleri beş karşılar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Lummio

    Michael Lumm

    25 Mayıs 2007
  • monkophile

    monkophile

    25 Temmuz 2007
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010