Конференция "Прочее" » set of TEnum в Си
 
  • KSergey © (06.07.16 17:29) [0]
    Скажите, а что, в самом деле в Си или С++ нет готовой конструкции на подобии set of TEnum из Delphi??

    Ну кроме std::bitset какого-нибудь, что-то нативное бы.
  • Игорь Шевченко © (06.07.16 17:34) [1]
    Нету. А зачем оно там ? Это же синтаксический сахар
  • Rouse_ © (06.07.16 18:18) [2]
    А маски тебе для чего - тоже самое только по другому выглядит
  • KSergey © (08.07.16 07:42) [3]
    Да, наверное сахар.
    При переходе с Си на Дельфи помню как смеялся над этим "зачем?! вот же, есть битовые константы!"
    А теперь сие видится уже откровенной ущербностью.

    В самом деле: enum с автонумерацией в Cи почему-то есть, хотя это тоже сахар в таком разрезе, а set - нету.
  • jack128 © (08.07.16 11:27) [4]
    а чем тебе сахара от битсета мало??

    enum MyEnum
    {  
    ONE, TWO, TREE
    }
    ;

    int main()
    {
    auto setOfEnum = std::bitset<TREE + 1>();

    auto printSetOfEnum = [&]() {
     std::cout << "------------------------------" << std::endl;
     std::cout << "ONE : " << setOfEnum[ONE] << std::endl;
     std::cout << "TWO : " << setOfEnum[TWO] << std::endl;
     std::cout << "TREE: " << setOfEnum[TREE] << std::endl;
    }
    ;


    setOfEnum[TWO] = true;
    printSetOfEnum();

    auto setOfEnum2 = std::bitset<TREE + 1>();
    setOfEnum2[ONE] = true;
    setOfEnum |= setOfEnum2; // аналог setOfEnum = setOfEnum + setOfEnum2
    printSetOfEnum();

    setOfEnum &= setOfEnum2;
    printSetOfEnum(); // аналог setOfEnum = setOfEnum * setOfEnum2

    std::string ch;
    std::cin >> ch;

       return 0;
    }

  • Kerk © (08.07.16 12:52) [5]
    Лет через 20 может добавят в стандарт, а пока мучайся :)
  • DayGaykin © (08.07.16 16:22) [6]
    finally бы добавили.
  • Kilkennycat © (08.07.16 16:56) [7]

    > finally бы добавили.

    зачем?
  • DayGaykin © (08.07.16 17:37) [8]

    > Kilkennycat ©   (08.07.16 16:56) [7]

    За тем же зачем и в Delphi.
  • Kilkennycat © (08.07.16 17:44) [9]

    > DayGaykin ©   (08.07.16 17:37) [8]

    то, что делается в делфи, легко реализуется в си и без финалли.
  • DayGaykin © (08.07.16 17:49) [10]

    > Kilkennycat ©   (08.07.16 17:44) [9]

    Я буду только рад, если научишь.

    К примеру, выключаем обработчик какого-то события:

    Saved = Some.OnEvent;
    Some.OnEvent = nil;
    try
     Code;
    finally
     Some.OnEvent = Saved;
    end;


    Класс создавать?
  • Kilkennycat © (08.07.16 18:09) [11]

    > DayGaykin ©   (08.07.16 17:49) [10]

    не особо отличается от:

    Saved = Some.OnEvent;
    Some.OnEvent = nil;
    try
     Code;
    catch () {}
    Some.OnEvent = Saved;

  • Jack128 © (08.07.16 18:39) [12]
    Пробросить исключение забыл.
    А вообще если такой код нужно 100-500 раз писать, то проще RAIIобертку написать
  • Kilkennycat © (08.07.16 19:02) [13]

    > Jack128 ©   (08.07.16 18:39) [12]

    ну, если быть принципиальным сишником, то ее надо писать, даже если такой код и надо :)
  • DayGaykin © (08.07.16 20:52) [14]
    Напишите, пожалуйста, правильный перевод того что я написал на RAII.
  • jack128 © (08.07.16 22:15) [15]
    template <typename EventType>
    struct EventOffOn {
    private:
    EventType* &event;
    EventType* oldValue;
    public:
    EventOffOn(EventType* &event): event(event) {
     this->oldValue = event;
     this->event = 0;
    }

    ~EventOffOn() { this->event = this->oldValue; }
    };
    template <typename EventType>
    EventOffOn<EventType> eventOffOn(EventType* &event) {
    return EventOffOn<EventType>(event);
    }
    ;



    пример использования:

    struct Obj
    {
    void (*Event)(int);
    void CallEvent(int value) {
     if (Event) Event(value);
     else cout << "no event handler" << endl;
    }

    };

    void handler(int value) { cout << "value: " << value << endl;  }

    int main() {
    Obj o;
    o.Event = handler;
    o.CallEvent(1);
    {
     auto x = eventOffOn(o.Event);
     o.CallEvent(2);
    }

    o.CallEvent(3);

    // your code goes here
    return 0;
    }

  • Kerk © (08.07.16 22:42) [16]
    Дичь какая. Действительно, нафига нужно finally
  • jack128 © (08.07.16 22:55) [17]

    > Действительно, нафига нужно finally

    естественно нафиг не нужен.
    delphi:
    var
     OldValue: TEventType;
    OldValue := Obj.Event;
    Obj.Event := null;
    try
    finally
     Obj.Event := nil;
    end;


    c++
    {
       auto = eventOnOff(obj.Event);
    }

  • jack128 © (08.07.16 23:01) [18]
    delphi:
    var
    OldValue: TEventType;
    OldValue := Obj.Event;
    Obj.Event := nil;
    try
    finally
    Obj.Event := nil;
    end;



    c++
    {
      auto = eventOffOn(obj.Event);
    }

  • jack128 © (08.07.16 23:12) [19]
    Последняя попытка

    delphi:
    var
    OldValue: TEventType;
    OldValue := Obj.Event;
    Obj.Event := nil;
    try
    finally
    Obj.Event := OldValue;
    end;



    c++
    {
     auto = eventOffOn(obj.Event);
    }

Есть новые Нет новых   [134432   +19][b:0][p:0.002]