Форум: "Прочее";
Текущий архив: 2017.11.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.002 c