- 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 };
};
какого хуя?
…его, правда, в стрим вообще выводить нельзя.
Нужно ввести новый синтаксис для задания точного порядка, в котором будут препроцессированы токены:
Здесь препроцессор сделает три прохода: на первом будут препроцессированы токены с приоритетом -1, на втором — с нулевым приоритетом и, наконец, на последнем проходе будет обработан 42-й приоритет.
Таким образом CAT объединит уже препроцессированные x и y без необходимости введения дополнительных макросов, а STR будет возвращать правильное строковое представление x:
P.S. Нагуглил. Если борец, то он в 1991-м только родился.
https://youtu.be/tUBVEKzsZ-k
По крайней мере, у моего сканера даже прошивки не было, её заливал драйвер с компа. Для линукса приходилось выковыривать эту прошивку из виндового пакета с дровами.
Интерфейсы чисто программные, да.
https://wandbox.org/permlink/xKirxHNm6Rbx8ePR
https://wandbox.org/permlink/g46U2AeBTyx6Qcqy
А ЗДЕСЬ ТЕКУТ ПО "SFINAE"
Я тебе вот чтоб скажу: чтоб понять SFINAE, надо сначала понять SFINAE. Substitution failure is not an error. Т.е. если подставить в шаблон некие параметры а в результате выходит поеботня, шаблон игнорируется, а не выдается ошибка компиляции.
Другими словами, SFINAE нужен чтоб в некоторых ситуациях игнорировать один шаблон (специально создавая невалидный код) чтоб использовать другой в некоторых ситуациях.
https://wandbox.org/permlink/kQhjVGRHQZRYVbjD
Поэтому я за "обдуманный выбор средств решения задачи".
https://wandbox.org/permlink/Sv1dM02fs4ijHRQn
Конпелятор ругается не на то, что у переменной b нет метода begin, а на то, что подходящая перегрузка не найдена:
И дальше он поясняет за SFINAE:
То есть при поиске перегрузки шаблон был проигнорирован, потому что при подстановке int в качестве T происходит ошибка.
Свифт течёт, или я не правильно тебя понял? В удаление циклических ссылок сейчас каждый говноязык умеет, даже "PHP".
Поэтому я за "PHP".
Можно захавать всю оперативку, доступную досовским программам, а потом вызвать функцию «Terminate & stay resident» и остаться в памяти.
P.S. Функция 48H –— выделить блок (BX=кокококоличество параграфов); 49H –— освободить блок (ES=сегментная часть адреса блока).
Это нужно, например, чтобы при запуске программы из программы (например, system("pause");) дочерней программе этот блок не был доступен.
Да, в реальном режиме никто не может запретить срать в чужую память, кроме правил хорошего тона.
Как по-твоему COM-файлы читали состояние светодиодов Caps Lock, Num Lock, Scroll Lock из нулевого сегмента?
Модель TINY гарантирует только то, что CS=SS=DS на старте программы, а потом ты можешь крутить сегменты, как хочешь (в рамках разумного, конечно, чтобы ничего не сломать).
Потом ты можешь честно попросить ещё немного памяти через INT 21H, AH=48H и работать с полученным блоком, а можешь и нагло распидорашивать весь первый мегабайт оперативки, включая код самой «DOS» или, например, shadow copy видеобиоса (чтобы шрифты поменять).
Или программы в DOS 1.0 использовали только ту память, которую им дали при старте, и больше никуда по соглашению не срали?
«European MS-DOS 4.0» –— это многозадачная версия «DOS», выпущенная по заказу «Siemens». Редкая вещь. Ни в файлообменниках, ни в P2P-сетях, ни на компакт-дисках я её не видел.
Для сравнения: «DR-DOS» поставлялся с программой «multitasker». Многозадачность была вытесняющей: программы он переключал принудительно по таймеру. Как было с памятью, не в курсе.
«MS-DOS» поставлялся с графической (но не оконной, а полноэкранной) оболочкой «DOSSHELL». У «DOSSHELL» был ручной переключатель задач: можно было запустить одну программу, поработать в ней, через «Alt+Tab» переключиться на другую, поработать в ней, потом переключиться обратно. Неактивную программу «DOSSHELL» мог высрать в своп-файл, чтобы сэкономить память («одновременно» запущенные программы всё равно друг друга не видели).
И это всё было в реальном режиме (или в V86, если был запущен EMM386). Хотя стоп, дурдосовский мультитаскер (в отличие от «DOSSHELL») работал только с EMM386, значит, виртуальный режим ему для чего-то был необходим.
XMS позволял оставлять DOS в реальном режиме и лишь при вызове API кратковременно переключался в защищённый режим, копировал нужный кусок памяти из памяти защищённого режима в память реального режима (т. е. куда-то в первый мегабайт) или обратно, а потом обратно переключался в реальный.
Dos4GW –— это одна из реализаций DPMI (их было море).
Была ещё такая штука:
https://en.wikipedia.org/wiki/DOS_Protected_Mode_Services
Использовалась редкими программами вроде Stacker/Doublespace/Drivespace (сжатие досовских дисков на лету) и некоторыми драйверами мыши.
Я слышал про «expansion cards», но вживую их не видел. То ли EMS, то ли XMS как раз и эмулировали API этих карточек.
«Нереальный» режим почти никем не использовался, потому что такие программы были несовместимы с EMS, DPMI и с Windows.
Да и хуй с ними. Зачем они тебе нужны если и так всю память видно? Ты же не собираешься её делить с другими прогами?
> Windows
А вот тут облом, да. Винда не даст переключиться в protected.
Затем, что программы, которым они потребуются, невозможно запустить в одном сеансе с программами «нереального» режима. Придётся перезагружать компьютер, чтобы перейти от программы одного режима к программе другого режима.
Чтобы не копировать первый мегабайт при каждом переключении контекста?
«Досшелл» не нужно быстрое переключение задач, поскольку там задачи переключаются по запросу пользователя. Он может работать и в реальном режиме, свопуя первый мегабайт на диск.
«Мультитаскер» же с его многозадачностью реального времени должен переключаться быстро, поэтому он переходит в V86 и мапит первый мегабайт для каждого приложения на разные области расширенной памяти. Ему для переключения не надо копировать блоки памяти, достаточно только пошаманить с таблицей дескрипторов.
Была ещё оболочка «GEM», которая тоже была внешне похожа на «Windows 3.x»...
Для таких переменных не нужны фиксапы (потому что смещение фиксировано), если es тоже фиксирован либо вычисляется, а не указывает на саму программу. Поэтому такие переменные можно использовать даже в com-файле.
Представляешь файловый менеджер для такой системы?
Но всё верно рассказал же.
weak_ptr помогает shared_ptr поддерживать граф владения ацикличным.
А из unique_ptr просто не стоит лепить что-то сложнее дерева (т.к. он с weak не взаимодействует).
Блядь, как всё сложно... Именно поэтому я за "C".
Кстати, в 'J' значения всех типов неизменяемые, но можно делать циклические сцылки в локалях или объектах (которые основаны на локалях):
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)).
А используется так:
Оно валидно, т.к. 0 кастится к нулевому указателю? А если не класс, то у него не может быть указателя на член?
https://ideone.com/u70mS9