SORU
16 EKİM 2008, PERŞEMBE


Nasıl kolayca dizelere c çeteleler haritası

Kullanıyorum bazı kütüphane başlık dosyasında numaralama türleri bir grup var, ve kullanıcı dizeleri - ve tersi numaralandırma değerleri dönüştürmek için bir yol var istiyorum.

RTTI 'kullanıcı dizeleri' sayımlarını biraz daha okunabilir olması gerekiyor. çünkü benim için yap, olmaz

Kaba kuvvet çözüm bu gibi işlevleri bir grup olurdu, ama bu C-gibi bir şey hissediyorum.

enum MyEnum {VAL1, VAL2,VAL3};

String getStringFromEnum(MyEnum e)
{
  switch e
  {
  case VAL1: return "Value 1";
  case VAL2: return "Value 2";
  case VAL1: return "Value 3";
  default: throw Exception("Bad MyEnum");
  }
}

Zarif bir çözüm şablonları kullanarak var olan bir içgüdü var, ama oldukça kafamı çevirdim çıkmadı.

GÜNCELLEME:Önerileriniz için teşekkürler - çeteleler bunların tanımını değiştirmek zorunda istemiyorum bu yüzden üçüncü taraf kitaplığı başlığında tanımlı olduğunu belirtmek gerekirdi.

Benim hislerime şimdi şablonları önlemek ve böyle bir şey için:

char * MyGetValue(int v, char *tmp); // implementation is trivial

#define ENUM_MAP(type, strings) char * getStringValue(const type &T) \
 { \
 return MyGetValue((int)T, strings); \
 }

; enum eee {AA,BB,CC}; - exists in library header file 
; enum fff {DD,GG,HH}; 

ENUM_MAP(eee,"AA|BB|CC")
ENUM_MAP(fff,"DD|GG|HH")

// To use...

	eee e;
	fff f;
	std::cout<< getStringValue(e);
	std::cout<< getStringValue(f);

CEVAP
16 EKİM 2008, PERŞEMBE


Eğer dizeleri olarak numaralama isimler kendilerini istiyorsanız, this postbkz. Aksi takdirde, std::map<MyEnum, char const*> bir işe yarayacak. (Dize hazır bilgi, std kopyalama anlamı::harita dizeleri)

Ekstra sözdizimsel şeker için, burada map_init bir sınıf yazmak için nasıl. Amaç sağlamaktır

std::map<MyEnum, const char*> MyMap;
map_init(MyMap)
    (eValue1, "A")
    (eValue2, "B")
    (eValue3, "C")
;

Fonksiyonu template <typename T> map_init(T&) map_init_helper<T> döndürür. map_init_helper<T> T& ve tanımlar önemsiz map_init_helper& operator()(typename T::key_type const&, typename T::value_type const&) depolar. (operator() *this *dönen 16* s operator<< gibi operator()) zincirleme sağlar

template<typename T> struct map_init_helper
{
    T& data;
    map_init_helper(T& d) : data(d) {}
    map_init_helper& operator() (typename T::key_type const& key, typename T::mapped_type const& value)
    {
        data[key] = value;
        return *this;
    }
};

template<typename T> map_init_helper<T> map_init(T& item)
{
    return map_init_helper<T>(item);
}

İşlevi ve yardımcı sınıfı şablonu esas alan olduğu için, Göster-gibi bir yapı herhangi bir harita için, ya da onları kullanabilirsiniz. I. e. ayrıca std::unordered_map giriş eklemek

Eğer bu yardımcıların yazma gibi, destek yok diye::ata aynı işlevi kutunun dışında mevcuttur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006
  • TopOfTheTech

    TopOfTheTech

    5 NİSAN 2010