Enum de─čerinin ge├žerli olup olmad─▒─č─▒ nas─▒l kontrol edilir?


Al─▒nan cevaba git


enum Bir ikili dosyadan bir de─čer okuyorum ve de─čerin ger├žekten enum de─čerlerin bir par├žas─▒ olup olmad─▒─č─▒n─▒ kontrol etmek istiyorum . Nas─▒l yapabilirim?

 #include <iostream>

enum Abc
{
    A = 4,
    B = 8,
    C = 12
};

int main()
{
    int v1 = 4;
    Abc v2 = static_cast< Abc >( v1 );

    switch ( v2 )
    {
        case A:
            std::cout<<"A"<<std::endl;
            break;
        case B:
            std::cout<<"B"<<std::endl;
            break;
        case C:
            std::cout<<"C"<<std::endl;
            break;
        default :
            std::cout<<"no match found"<<std::endl;
    }
}
 

switch Operat├Âr├╝ kullanmak zorunda m─▒y─▒m yoksa daha iyi bir yolu var m─▒?

D├ťZENLE

Ayarlanm─▒┼č enum de─čerlerine sahibim ve ne yaz─▒k ki bunlar─▒ de─či┼čtiremiyorum. ─░┼čleri daha k├Ât├╝ hale getirmek i├žin s├╝rekli de─čildir (de─čerleri 0, 75,76,80,85,90,95,100, vb.)


44









Cevap say─▒s─▒n─▒ say: 8






enum De─čer, a┼ča─č─▒daki standart kural taraf─▒ndan tan─▒mlanan [A, B] aral─▒─č─▒na d├╝┼čerse C ++ 'ta ge├žerlidir. Bu nedenle enum X { A = 1, B = 3 } , de─čeri 2 ge├žerli bir enum de─čeri olarak kabul edilir.

Standart 7.2 / 6'y─▒ g├Âz ├Ân├╝nde bulundurun:

Emin de─čerinin en k├╝├ž├╝k numaraland─▒r─▒c─▒ ve emax'─▒n en b├╝y├╝k oldu─ču bir numaraland─▒rma i├žin, numaraland─▒rma de─čerleri, bmin-bmax aral─▒─č─▒nda temel tipteki de─čerlerdir; burada bmin ve bmax, s─▒ras─▒yla en k├╝├ž├╝k ve en k├╝├ž├╝k de─čerlerdir. emin ve emax'─▒ depolayabilen bit alan─▒. Herhangi bir numaraland─▒r─▒c─▒ taraf─▒ndan tan─▒mlanmayan de─čerlere sahip bir numaraland─▒rma tan─▒mlamak m├╝mk├╝nd├╝r.

C ++ 'da retrospeksiyon yoktur. Al─▒nacak yakla┼č─▒mlardan biri, enum de─čerlerini bir dizideki ek olarak listelemek ve d├Ân├╝┼čt├╝rme yapacak ve muhtemelen ba┼čar─▒s─▒zl─▒─ča bir istisna atan bir sarmalay─▒c─▒ yazmakt─▒r.

Daha fazla bilgi i├žin Enum'a nas─▒l int kullan─▒laca─č─▒na dair Benzer Soruya bak─▒n─▒z.


24







Belki bu ┼čekilde enum kullan─▒n:

 enum MyEnum
{
A,
B,
C
};
 

ve kontrol etmek

 if (v2 >= A && v2 <= C)
 

Enum sabitleri i├žin de─čer belirtmezseniz, de─čerler s─▒f─▒rdan ba┼člar ve listenin her a┼ča─č─▒ hareketi ile birer birer artar. ├ľrne─čin, enum MyEnumType { ALPHA, BETA, GAMMA }; ALPHA de─čeri 0, BETA de─čeri 1 ve GAMMA de─čeri 2'dir.


11







C ++ 11'de, enum de─čerlerinizi ┼čablon parametreleri olarak listelemeye haz─▒rsan─▒z daha iyi bir yol vard─▒r. Buna, ge├žerli enum de─čerlerinin altk├╝melerini farkl─▒ ba─člamlarda kabul etmenizi sa─člayan iyi bir ┼čey olarak bakabilirsiniz; harici kaynaklardan kodlar─▒ ayr─▒┼čt─▒r─▒rken genellikle yararl─▒d─▒r.

A┼ča─č─▒daki ├Ârne─če olas─▒ faydal─▒ bir ilave, kesme sorunlar─▒n─▒ ├Ânlemek i├žin IntType'a g├Âre altta yatan EnumType tipinin etraf─▒nda baz─▒ statik iddialar olabilir. Bir egzersiz olarak b─▒rakt─▒.

 #include <stdio.h>

template<typename EnumType, EnumType... Values> class EnumCheck;

template<typename EnumType> class EnumCheck<EnumType>
{
public:
    template<typename IntType>
    static bool constexpr is_value(IntType) { return false; }
};

template<typename EnumType, EnumType V, EnumType... Next>
class EnumCheck<EnumType, V, Next...> : private EnumCheck<EnumType, Next...>
{
    using super = EnumCheck<EnumType, Next...>;

public:
    template<typename IntType>
    static bool constexpr is_value(IntType v)
    {
        return v == static_cast<IntType>(V) || super::is_value(v);
    }
};

enum class Test {
    A = 1,
    C = 3,
    E = 5
};

using TestCheck = EnumCheck<Test, Test::A, Test::C, Test::E>;

void check_value(int v)
{
    if (TestCheck::is_value(v))
        printf("%d is OK\n", v);
    else
        printf("%d is not OK\n", v);
}

int main()
{
    for (int i = 0; i < 10; ++i)
        check_value(i);
}
 

10


2015-10-12





┼×imdiye kadar 'kolay' yapmak i├žin buldu─čum yegane yol, s─▒ral─▒ dizilerin bir s─▒ralamas─▒n─▒ (makro) olu┼čturmak ve bunu kontrol etmekti.

switch Numara ile ba┼čar─▒s─▒z enum bir ├ž├╝nk├╝ s enum , belirli bir de─čere sahip birden fazla numaraland─▒r─▒c─▒y─▒ sahip olabilir.

Ger├žekten can s─▒k─▒c─▒ bir konu.


7







C ++ i├žin Managed Extensions a┼ča─č─▒daki s├Âzdizimini destekler:

 enum Abc
{
    A = 4,
    B = 8,
    C = 12
};

Enum::IsDefined(Abc::typeid, 8);
 

Referans: MSDN " C ++ Programlama i├žin Y├Ânetilen Uzant─▒lar "


5







Biraz necro, ama ... ilk / son enum de─čerlerine int RANGE kontrol├╝ yapar (tam kontrolleri yapmak i├žin janm'─▒n fikriyle birle┼čtirilebilir), C ++ 11:

Ba┼čl─▒k:

 namespace chkenum
{
    template <class T, T begin, T end>
    struct RangeCheck
    {
    private:
        typedef typename std::underlying_type<T>::type val_t;
    public:
        static
        typename std::enable_if<std::is_enum<T>::value, bool>::type
        inrange(val_t value)
        {
            return value >= static_cast<val_t>(begin) && value <= static_cast<val_t>(end);
        }
    };

    template<class T>
    struct EnumCheck;
}

#define DECLARE_ENUM_CHECK(T,B,E) namespace chkenum {template<> struct EnumCheck<T> : public RangeCheck<T, B, E> {};}

template<class T>
inline
typename std::enable_if<std::is_enum<T>::value, bool>::type
testEnumRange(int val)
{
    return chkenum::EnumCheck<T>::inrange(val);
}
 

Enum bildirimi:

 enum MinMaxType
{
     Max = 0x800, Min, Equal
};
DECLARE_ENUM_CHECK(MinMaxType, MinMaxType::Max, MinMaxType::Equal);
 

Kullan─▒m─▒:

 bool r = testEnumRange<MinMaxType>(i);
 

Yukar─▒dakilerin temel fark─▒, test fonksiyonunun sadece enum tipine ba─čl─▒ oldu─čunu ileri s├╝rd├╝.


3







Dil hakk─▒nda konu┼čursak, daha iyi bir yol yoktur, enum de─čerleri sadece derleme zaman─▒ vard─▒r ve bunlar─▒ programl─▒ olarak numaraland─▒rman─▒n bir yolu yoktur. ─░yi d├╝┼č├╝n├╝lm├╝┼č bir altyap─▒ sayesinde, t├╝m de─čerleri birka├ž kez listelemekten ka├ž─▒nmaya devam edebilirsiniz. Bkz C dize olarak enum t├╝rlerinin de─či┼čkenleri Kullan─▒m─▒ kolay yolu?

Daha sonra, ├Ârnek olarak verilen "enumFactory.h" kullan─▒larak ├Ârnek yaz─▒labilir:

 #include "enumFactory.h"

#define ABC_ENUM(XX) \
    XX(A,=4) \
    XX(B,=8) \
    XX(C,=12) \

DECLARE_ENUM(Abc,ABC_ENUM)

int main()
{
    int v1 = 4;
    Abc v2 = static_cast< Abc >( v1 );

    #define CHECK_ENUM_CASE(name,assign) case name: std::cout<< #name <<std::endl; break;
    switch ( v2 )
    {
        ABC_ENUM(CHECK_ENUM_CASE)
        default :
            std::cout<<"no match found"<<std::endl;
    }
    #undef CHECK_ENUM_CASE
}
 

veya hatta (bu ba┼čl─▒kta zaten mevcut olan baz─▒ olanaklar─▒ kullanarak):

 #include "enumFactory.h"

#define ABC_ENUM(XX) \
    XX(A,=4) \
    XX(B,=8) \
    XX(C,=12) \

DECLARE_ENUM(Abc,ABC_ENUM)
DEFINE_ENUM(Abc,ABC_ENUM)

int main()
{
    int v1 = 4;
    Abc v2 = static_cast< Abc >( v1 );
    const char *name = GetString(v2);
    if (name[0]==0) name = "no match found";
    std::cout << name << std::endl;
}
 

2


2011-02-11





Bunu yapman─▒n ba┼čka bir yolu:

 #include <algorithm>
#include <iterator>
#include <iostream>

template<typename>
struct enum_traits { static constexpr void* values = nullptr; };

namespace detail
{

template<typename T>
constexpr bool is_value_of(int, void*) { return false; }

template<typename T, typename U>
constexpr bool is_value_of(int v, U)
{
    using std::begin; using std::end;

    return std::find_if(begin(enum_traits<T>::values), end(enum_traits<T>::values),
        [=](auto value){ return value == static_cast<T>(v); }
    ) != end(enum_traits<T>::values);
}

}

template<typename T>
constexpr bool is_value_of(int v)
{ return detail::is_value_of<T>(v, decltype(enum_traits<T>::values) { }); }

////////////////////
enum Abc { A = 4, B = 8, C = 12 };

template<>
struct enum_traits<Abc> { static constexpr auto values = { A, B, C }; };
decltype(enum_traits<Abc>::values) enum_traits<Abc>::values;

enum class Def { D = 1, E = 3, F = 5 };

int main()
{
    std::cout << "Abc:";
    for(int i = 0; i < 10; ++i)
        if(is_value_of<Abc>(i)) std::cout << " " << i;
    std::cout << std::endl;

    std::cout << "Def:";
    for(int i = 0; i < 10; ++i)
        if(is_value_of<Def>(i)) std::cout << " " << i;
    std::cout << std::endl;

    return 0;
}
 

Bu yakla┼č─▒m─▒n "├žirkin" k─▒sm─▒ IMHO tan─▒mlamak zorunda:

 decltype(enum_traits<Abc>::values) enum_traits<Abc>::values
 

Makrolara kar┼č─▒ de─čilseniz, bir makro i├žine sarabilirsiniz:

 #define REGISTER_ENUM_VALUES(name, ...) \
template<> struct enum_traits<name> { static constexpr auto values = { __VA_ARGS__ }; }; \
decltype(enum_traits<name>::values) enum_traits<name>::values;
 

0



─░lgili yay─▒nlar


Bir dize, Try / Catch kullanmadan JavaScript'te ge├žerli bir JSON dizesi olup olmad─▒─č─▒n─▒ kontrol etme

Pandas DataFrame'de NaN olup olmad─▒─č─▒n─▒ kontrol etme

S├Âzl├╝kte bir de─čer olup olmad─▒─č─▒n─▒ kontrol etme (python)

Bir URL'nin ge├žerli olup olmad─▒─č─▒n─▒ kontrol etmenin en iyi yolu

Bir say─▒n─▒n iki de─čer aras─▒nda olup olmad─▒─č─▒ nas─▒l kontrol edilir?

Bir dize ge├žerli bir onalt─▒l─▒k renk temsili olup olmad─▒─č─▒n─▒ kontrol nas─▒l

Bir dize ge├žerli bir tarih olup olmad─▒─č─▒n─▒ kontrol etme

Bootstrap modunun a├ž─▒k olup olmad─▒─č─▒ nas─▒l kontrol edilir, bu y├╝zden jquery validate kullanabilirim

Bir URL'nin ge├žerli olup olmad─▒─č─▒n─▒ kontrol etme

Bir dosyan─▒n ge├žerli bir resim dosyas─▒ olup olmad─▒─č─▒ nas─▒l kontrol edilir?

Etiketle ilgili di─čer sorular [c++]


Java'n─▒n neden + =, - =, * =, / = bile┼čik g├Ârevlendirme operat├Ârleri yay─▒n gerektirmiyor?

Alt mod├╝ller dahil olmak ├╝zere "git klon" nas─▒l yap─▒l─▒r?

Dizi ├Â─čelerini JavaScript'te silme - vs splice sil

Girilen sat─▒r─▒n kimli─čini alman─▒n en iyi yolu?

Android'e TCP ├╝zerinden ADB ile nas─▒l ba─članabilirim?

T├╝m "izin verilmeyen" iletileri "bulma" i┼čleminden nas─▒l hari├ž tutabilirim?

T├╝m ├ž─▒kt─▒lar─▒ dosyaya y├Ânlendir [├žo─čalt]

Java'da bayt [] i├žin dosya

G├Âm├╝l├╝ kaynak metin dosyas─▒ nas─▒l okunur

Bir NSArray ├╝zerinde nas─▒l yinelenirim?