- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*);
// Will be chosen if T is anything except a class.
template<typename C> static Two test(...);
public:
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
};
A3APTHblu_nemyx 19.03.2019 00:59 # 0
какого хуя?
TEH3OPHblu_nemyx 19.03.2019 01:09 # 0
gost 19.03.2019 01:30 # 0
bormand 19.03.2019 01:47 # +1
gost 19.03.2019 02:21 # 0
…его, правда, в стрим вообще выводить нельзя.
BEKTOPHblu_nETyX 19.03.2019 06:53 # 0
BEKTOPHblu_nETyX 19.03.2019 06:48 # 0
BEKTOPHblu_nETyX 19.03.2019 06:50 # 0
BEKTOPHblu_nETyX 19.03.2019 07:08 # 0
BEKTOPHblu_nETyX 19.03.2019 07:13 # 0
BEKTOPHblu_nETyX 19.03.2019 08:18 # 0
bormand 19.03.2019 08:24 # +1
gost 19.03.2019 10:00 # +1
Нужно ввести новый синтаксис для задания точного порядка, в котором будут препроцессированы токены:
Здесь препроцессор сделает три прохода: на первом будут препроцессированы токены с приоритетом -1, на втором — с нулевым приоритетом и, наконец, на последнем проходе будет обработан 42-й приоритет.
Таким образом CAT объединит уже препроцессированные x и y без необходимости введения дополнительных макросов, а STR будет возвращать правильное строковое представление x:
TEH3OPHblu_nemyx 19.03.2019 13:30 # 0
MPA3b 20.03.2019 07:22 # 0
TEH3OPHblu_nemyx 20.03.2019 14:59 # 0
MPA3b 20.03.2019 18:04 # 0
guest8 20.03.2019 18:05 # −999
TEH3OPHblu_nemyx 20.03.2019 18:15 # 0
P.S. Нагуглил. Если борец, то он в 1991-м только родился.
guest8 20.03.2019 18:18 # −999
TEH3OPHblu_nemyx 20.03.2019 18:21 # 0
OlegUP 02.04.2019 08:18 # 0
PACTPOBblu_nemyx 28.04.2019 19:49 # 0
https://youtu.be/tUBVEKzsZ-k
gost 28.04.2019 20:08 # 0
PACTPOBblu_nemyx 28.04.2019 20:12 # 0
cmepmop 02.04.2019 17:24 # 0
BEKTOPHblu_nETyX 01.05.2019 21:06 # 0
MPA3b 20.03.2019 07:22 # 0
bormand 20.03.2019 08:02 # 0
guest8 20.03.2019 16:22 # −999
bormand 20.03.2019 17:31 # 0
По крайней мере, у моего сканера даже прошивки не было, её заливал драйвер с компа. Для линукса приходилось выковыривать эту прошивку из виндового пакета с дровами.
Интерфейсы чисто программные, да.
TEH3OPHblu_nemyx 20.03.2019 17:51 # 0
guest8 20.03.2019 17:56 # −999
TEH3OPHblu_nemyx 20.03.2019 17:58 # 0
guest8 20.03.2019 18:05 # −999
guest8 20.03.2019 17:55 # −999
MPA3b 20.03.2019 18:05 # 0
TEH3OPHblu_nemyx 20.03.2019 18:21 # 0
MPA3b 20.03.2019 18:07 # 0
TEH3OPHblu_nemyx 20.03.2019 18:13 # 0
m_dark 21.03.2019 09:02 # 0
MPA3b 21.03.2019 10:07 # 0
TEH3OPHblu_nemyx 21.03.2019 13:16 # 0
cmepmop 21.03.2019 13:33 # 0
TEH3OPHblu_nemyx 21.03.2019 13:52 # 0
gost 21.03.2019 14:01 # 0
TEH3OPHblu_nemyx 21.03.2019 14:54 # 0
COTOHuHCKuu_nemyx 22.03.2019 08:51 # 0
guest8 21.03.2019 16:44 # −999
MPA3b 21.03.2019 16:46 # 0
guest8 21.03.2019 16:47 # −999
Elvenfighter 19.03.2019 21:20 # 0
https://wandbox.org/permlink/xKirxHNm6Rbx8ePR
gost 19.03.2019 21:29 # 0
https://wandbox.org/permlink/g46U2AeBTyx6Qcqy
Elvenfighter 19.03.2019 21:48 # +1
MPA3b 20.03.2019 07:20 # 0
OCETuHCKuu_nemyx 21.03.2019 22:11 # 0
А ЗДЕСЬ ТЕКУТ ПО "SFINAE"
OCETuHCKuu_nemyx 19.03.2019 23:25 # 0
Elvenfighter 20.03.2019 10:06 # +1
Я тебе вот чтоб скажу: чтоб понять SFINAE, надо сначала понять SFINAE. Substitution failure is not an error. Т.е. если подставить в шаблон некие параметры а в результате выходит поеботня, шаблон игнорируется, а не выдается ошибка компиляции.
Другими словами, SFINAE нужен чтоб в некоторых ситуациях игнорировать один шаблон (специально создавая невалидный код) чтоб использовать другой в некоторых ситуациях.
Elvenfighter 20.03.2019 10:30 # +1
https://wandbox.org/permlink/kQhjVGRHQZRYVbjD
Поэтому я за "обдуманный выбор средств решения задачи".
gost 20.03.2019 14:17 # 0
https://wandbox.org/permlink/Sv1dM02fs4ijHRQn
Конпелятор ругается не на то, что у переменной b нет метода begin, а на то, что подходящая перегрузка не найдена:
И дальше он поясняет за SFINAE:
То есть при поиске перегрузки шаблон был проигнорирован, потому что при подстановке int в качестве T происходит ошибка.
gost 20.03.2019 14:18 # 0
MPA3b 21.03.2019 16:47 # 0
guest8 21.03.2019 16:54 # −999
TEH3OPHblu_nemyx 21.03.2019 17:19 # 0
Elvenfighter 21.03.2019 23:23 # +1
OCETuHCKuu_nemyx 21.03.2019 23:28 # +1
Perevedi_na_PHP 21.03.2019 23:35 # 0
guest8 22.03.2019 00:52 # −999
Perevedi_na_PHP 22.03.2019 00:59 # 0
Свифт течёт, или я не правильно тебя понял? В удаление циклических ссылок сейчас каждый говноязык умеет, даже "PHP".
guest8 22.03.2019 01:04 # −999
Perevedi_na_PHP 22.03.2019 01:05 # 0
Поэтому я за "PHP".
guest8 22.03.2019 01:08 # −999
guest8 22.03.2019 01:10 # −999
guest8 22.03.2019 01:27 # −999
TEH3OPHblu_nemyx 22.03.2019 01:30 # +1
Можно захавать всю оперативку, доступную досовским программам, а потом вызвать функцию «Terminate & stay resident» и остаться в памяти.
guest8 22.03.2019 01:32 # −999
TEH3OPHblu_nemyx 22.03.2019 01:33 # 0
P.S. Функция 48H –— выделить блок (BX=кокококоличество параграфов); 49H –— освободить блок (ES=сегментная часть адреса блока).
guest8 22.03.2019 01:35 # −999
TEH3OPHblu_nemyx 22.03.2019 01:38 # +1
Это нужно, например, чтобы при запуске программы из программы (например, system("pause");) дочерней программе этот блок не был доступен.
guest8 22.03.2019 01:40 # −999
TEH3OPHblu_nemyx 22.03.2019 01:42 # +1
Да, в реальном режиме никто не может запретить срать в чужую память, кроме правил хорошего тона.
guest8 22.03.2019 01:33 # −999
TEH3OPHblu_nemyx 22.03.2019 01:36 # +2
Как по-твоему COM-файлы читали состояние светодиодов Caps Lock, Num Lock, Scroll Lock из нулевого сегмента?
guest8 22.03.2019 01:38 # −999
TEH3OPHblu_nemyx 22.03.2019 01:40 # 0
Модель TINY гарантирует только то, что CS=SS=DS на старте программы, а потом ты можешь крутить сегменты, как хочешь (в рамках разумного, конечно, чтобы ничего не сломать).
guest8 22.03.2019 01:45 # −999
TEH3OPHblu_nemyx 22.03.2019 01:48 # +1
Потом ты можешь честно попросить ещё немного памяти через INT 21H, AH=48H и работать с полученным блоком, а можешь и нагло распидорашивать весь первый мегабайт оперативки, включая код самой «DOS» или, например, shadow copy видеобиоса (чтобы шрифты поменять).
guest8 22.03.2019 01:53 # −999
TEH3OPHblu_nemyx 22.03.2019 01:55 # 0
Или программы в DOS 1.0 использовали только ту память, которую им дали при старте, и больше никуда по соглашению не срали?
guest8 22.03.2019 02:00 # −999
guest8 22.03.2019 02:02 # −999
TEH3OPHblu_nemyx 22.03.2019 02:04 # +1
«European MS-DOS 4.0» –— это многозадачная версия «DOS», выпущенная по заказу «Siemens». Редкая вещь. Ни в файлообменниках, ни в P2P-сетях, ни на компакт-дисках я её не видел.
guest8 22.03.2019 02:07 # −999
TEH3OPHblu_nemyx 22.03.2019 02:13 # 0
Для сравнения: «DR-DOS» поставлялся с программой «multitasker». Многозадачность была вытесняющей: программы он переключал принудительно по таймеру. Как было с памятью, не в курсе.
«MS-DOS» поставлялся с графической (но не оконной, а полноэкранной) оболочкой «DOSSHELL». У «DOSSHELL» был ручной переключатель задач: можно было запустить одну программу, поработать в ней, через «Alt+Tab» переключиться на другую, поработать в ней, потом переключиться обратно. Неактивную программу «DOSSHELL» мог высрать в своп-файл, чтобы сэкономить память («одновременно» запущенные программы всё равно друг друга не видели).
И это всё было в реальном режиме (или в V86, если был запущен EMM386). Хотя стоп, дурдосовский мультитаскер (в отличие от «DOSSHELL») работал только с EMM386, значит, виртуальный режим ему для чего-то был необходим.
guest8 22.03.2019 02:22 # −999
TEH3OPHblu_nemyx 22.03.2019 02:30 # 0
XMS позволял оставлять DOS в реальном режиме и лишь при вызове API кратковременно переключался в защищённый режим, копировал нужный кусок памяти из памяти защищённого режима в память реального режима (т. е. куда-то в первый мегабайт) или обратно, а потом обратно переключался в реальный.
Dos4GW –— это одна из реализаций DPMI (их было море).
Была ещё такая штука:
https://en.wikipedia.org/wiki/DOS_Protected_Mode_Services
Использовалась редкими программами вроде Stacker/Doublespace/Drivespace (сжатие досовских дисков на лету) и некоторыми драйверами мыши.
guest8 22.03.2019 02:35 # −999
TEH3OPHblu_nemyx 22.03.2019 02:40 # 0
Я слышал про «expansion cards», но вживую их не видел. То ли EMS, то ли XMS как раз и эмулировали API этих карточек.
TEH3OPHblu_nemyx 22.03.2019 02:36 # +1
«Нереальный» режим почти никем не использовался, потому что такие программы были несовместимы с EMS, DPMI и с Windows.
guest8 22.03.2019 02:45 # −999
guest8 22.03.2019 15:53 # −999
guest8 22.03.2019 15:54 # −999
guest8 22.03.2019 16:11 # −999
guest8 22.03.2019 16:25 # −999
COTOHuHCKuu_nemyx 22.03.2019 16:26 # +1
bormand 22.03.2019 07:44 # 0
Да и хуй с ними. Зачем они тебе нужны если и так всю память видно? Ты же не собираешься её делить с другими прогами?
> Windows
А вот тут облом, да. Винда не даст переключиться в protected.
TEH3OPHblu_nemyx 22.03.2019 12:09 # 0
Затем, что программы, которым они потребуются, невозможно запустить в одном сеансе с программами «нереального» режима. Придётся перезагружать компьютер, чтобы перейти от программы одного режима к программе другого режима.
bormand 22.03.2019 07:08 # +1
Чтобы не копировать первый мегабайт при каждом переключении контекста?
TEH3OPHblu_nemyx 22.03.2019 12:15 # 0
«Досшелл» не нужно быстрое переключение задач, поскольку там задачи переключаются по запросу пользователя. Он может работать и в реальном режиме, свопуя первый мегабайт на диск.
«Мультитаскер» же с его многозадачностью реального времени должен переключаться быстро, поэтому он переходит в V86 и мапит первый мегабайт для каждого приложения на разные области расширенной памяти. Ему для переключения не надо копировать блоки памяти, достаточно только пошаманить с таблицей дескрипторов.
TEH3OPHblu_nemyx 22.03.2019 02:09 # 0
Была ещё оболочка «GEM», которая тоже была внешне похожа на «Windows 3.x»...
guest8 22.03.2019 02:23 # −999
COTOHuHCKuu_nemyx 22.03.2019 09:20 # +1
TEH3OPHblu_nemyx 22.03.2019 12:18 # 0
Для таких переменных не нужны фиксапы (потому что смещение фиксировано), если es тоже фиксирован либо вычисляется, а не указывает на саму программу. Поэтому такие переменные можно использовать даже в com-файле.
TEH3OPHblu_nemyx 22.03.2019 01:52 # 0
guest8 22.03.2019 01:54 # −999
TEH3OPHblu_nemyx 22.03.2019 16:05 # +1
Представляешь файловый менеджер для такой системы?
guest8 22.03.2019 01:55 # −999
guest8 22.03.2019 15:55 # −999
Perevedi_na_PHP 22.03.2019 01:06 # 0
guest8 22.03.2019 01:09 # −999
bormand 22.03.2019 07:38 # +2
Но всё верно рассказал же.
weak_ptr помогает shared_ptr поддерживать граф владения ацикличным.
А из unique_ptr просто не стоит лепить что-то сложнее дерева (т.к. он с weak не взаимодействует).
COTOHuHCKuu_nemyx 22.03.2019 09:04 # +1
Блядь, как всё сложно... Именно поэтому я за "C".
COTOHuHCKuu_nemyx 22.03.2019 09:03 # 0
TEH3OPHblu_nemyx 22.03.2019 12:19 # 0
COTOHuHCKuu_nemyx 22.03.2019 13:09 # +1
Кстати, в 'J' значения всех типов неизменяемые, но можно делать циклические сцылки в локалях или объектах (которые основаны на локалях):
gost 19.03.2019 01:57 # +3
https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members
Это указатель на член класса C.
> Как эта поебота работает?
Магия — в выражении «sizeof(IsClassT<T>::test<T>(0)) == 1». Когда компилятор его встречает — он начинает искать перегрузку метода «test», которая может принять «0».
Сначала компилятор пытается инстанцировать шаблонную функцию «One test(int C::*)» — принимающую указатель на целочисленный член класса C и возвращающую объект типа One.
Если C — это класс, то объявление «One test(int C::*)» валидно, и компилятор рассматривает эту перегрузку. Он видит, что других подходящих перегрузок нет («test(...)» компилятор проигнорирует, поскольку имеется подходящая перегрузка с фиксированным числом параметров), а потому размер выражения «IsClassT<T>::test<T>(0)» будет равен размеру «One».
Если C — это не класс, то объявление «One test(int C::*)» — это ошибка. Однако, по правилу SFINAE, компиляция не упадёт, а компилятор продолжит поиск подходящей перегрузки. Поскольку других объявлений «test» нет, будет выбран вариант с «...», а размер «магического выражения» станет равным двум (sizeof(Two)).
gost 19.03.2019 02:19 # 0
А используется так:
OCETuHCKuu_nemyx 19.03.2019 23:22 # 0
gost 19.03.2019 23:27 # 0
OCETuHCKuu_nemyx 19.03.2019 23:24 # 0
OCETuHCKuu_nemyx 19.03.2019 23:32 # 0
Оно валидно, т.к. 0 кастится к нулевому указателю? А если не класс, то у него не может быть указателя на член?
gost 19.03.2019 23:53 # 0
https://ideone.com/u70mS9
OlegUP 02.04.2019 08:17 # 0