SORU
12 Kasım 2010, Cuma


İnt numaralama atama için genel yolu C

Genel C enum int döküm var mı?

int enum bir değer döndürmesi gerekir enum bir aralıkta, aksi takdirde exception Bir at. Bir şekilde yazmak varjenerik? 8* *birden fazla desteklenmeli.

Arka plan: bir dış varnumaralamayazın vehiçbir kontrolükaynak kod üzerinde. Bir veritabanı bu değeri saklamak ve almak istiyorum.

CEVAP
12 Kasım 2010, Cuma


Açık bir şey senin numaralama açıklama için:

// generic code
#include <algorithm>

template <typename T>
struct enum_traits {};

template<typename T, size_t N>
T *endof(T (&ra)[N]) {
    return ra   N;
}

template<typename T, typename ValType>
T check(ValType v) {
    typedef enum_traits<T> traits;
    const T *first = traits::enumerators;
    const T *last = endof(traits::enumerators);
    if (traits::sorted) { // probably premature optimization
        if (std::binary_search(first, last, v)) return T(v);
    } else if (std::find(first, last, v) != last) {
        return T(v);
    }
    throw "exception";
}

// "enhanced" definition of enum
enum e {
    x = 1,
    y = 4,
    z = 10,
};

template<>
struct enum_traits<e> {
    static const e enumerators[];
    static const bool sorted = true;
};
// must appear in only one TU,
// so if the above is in a header then it will need the array size
const e enum_traits<e>::enumerators[] = {x, y, z};

// usage
int main() {
    e good = check<e>(1);
    e bad = check<e>(2);
}

Dizi e yazarı yok eğer bir sıkıntı olan e ile güncel tutulmaları gerekir. Sjoerd dediği gibi, muhtemelen herhangi bir iyi inşa sistemi ile otomatik olabilir.

Her durumda, 7.2/6 karşı karşıya olduğunu:

Emin olduğu bir sıralama için en küçük numaralandırıcısı ve giyer bağlıdır. en büyük, numaralandırma değerleri temel türü değerleri aralığı için bmin bmax, nerede bmin ve bmax, sırasıyla. bu en küçük ve en büyük değerleri en küçük bit-alan emin saklayabilirsiniz ve giyer bağlıdır. Olası bir tanımlamak için değerleri olan numaralandırma onun sıralayıcısını herhangi biri tarafından tanımlanan.

Eğer öyleyse e, yazarı değilse olabilir veya e geçerli değerler aslında tanımı görünen bir garanti olmayabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • maxman.tv

    maxman.tv

    29 EKİM 2013