Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.11.19;
Скачать: CL | DM;

Вниз

set of TEnum в Си   Найти похожие ветки 

 
KSergey ©   (2016-07-06 17:29) [0]

Скажите, а что, в самом деле в Си или С++ нет готовой конструкции на подобии set of TEnum из Delphi??

Ну кроме std::bitset какого-нибудь, что-то нативное бы.


 
Игорь Шевченко ©   (2016-07-06 17:34) [1]

Нету. А зачем оно там ? Это же синтаксический сахар


 
Rouse_ ©   (2016-07-06 18:18) [2]

А маски тебе для чего - тоже самое только по другому выглядит


 
KSergey ©   (2016-07-08 07:42) [3]

Да, наверное сахар.
При переходе с Си на Дельфи помню как смеялся над этим "зачем?! вот же, есть битовые константы!"
А теперь сие видится уже откровенной ущербностью.

В самом деле: enum с автонумерацией в Cи почему-то есть, хотя это тоже сахар в таком разрезе, а set - нету.


 
jack128 ©   (2016-07-08 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 ©   (2016-07-08 12:52) [5]

Лет через 20 может добавят в стандарт, а пока мучайся :)


 
DayGaykin ©   (2016-07-08 16:22) [6]

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


 
Kilkennycat ©   (2016-07-08 16:56) [7]


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

зачем?


 
DayGaykin ©   (2016-07-08 17:37) [8]


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

За тем же зачем и в Delphi.


 
Kilkennycat ©   (2016-07-08 17:44) [9]


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

то, что делается в делфи, легко реализуется в си и без финалли.


 
DayGaykin ©   (2016-07-08 17:49) [10]


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

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

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

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


Класс создавать?


 
Kilkennycat ©   (2016-07-08 18:09) [11]


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

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

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


 
Jack128 ©   (2016-07-08 18:39) [12]

Пробросить исключение забыл.
А вообще если такой код нужно 100-500 раз писать, то проще RAIIобертку написать


 
Kilkennycat ©   (2016-07-08 19:02) [13]


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

ну, если быть принципиальным сишником, то ее надо писать, даже если такой код и надо :)


 
DayGaykin ©   (2016-07-08 20:52) [14]

Напишите, пожалуйста, правильный перевод того что я написал на RAII.


 
jack128 ©   (2016-07-08 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 ©   (2016-07-08 22:42) [16]

Дичь какая. Действительно, нафига нужно finally


 
jack128 ©   (2016-07-08 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 ©   (2016-07-08 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 ©   (2016-07-08 23:12) [19]

Последняя попытка

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


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



Страницы: 1 вся ветка

Текущий архив: 2017.11.19;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.004 c
15-1467815349
KSergey
2016-07-06 17:29
2017.11.19
set of TEnum в Си


2-1450113022
gedevan
2015-12-14 20:10
2017.11.19
Можно ли подключиться к базе Access через TStream?


15-1467754202
Юрий
2016-07-06 00:30
2017.11.19
С днем рождения ! 6 июля 2016 среда


15-1467813185
Unbekannt
2016-07-06 16:53
2017.11.19
Проблема с печатью этикеток на разных принтерах


2-1450420953
jetairnav
2015-12-18 09:42
2017.11.19
Массив из переменных