Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1467754202
Юрий
2016-07-06 00:30
2017.11.19
С днем рождения ! 6 июля 2016 среда


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


2-1451037235
Михалыч
2015-12-25 12:53
2017.11.19
Программное удаление в Firebird


15-1467649943
Копир
2016-07-04 19:32
2017.11.19
И не скучно Вам?


2-1449253907
Валя
2015-12-04 21:31
2017.11.19
Запись/чтение Bitmap+текстовое описание в файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский