Имбирная Ведьмочка
> то я не буду заботиться дочитывать его до конца.
Да без проблем.
Охтыж я прозрел!!!
Естественно возник вопрос - а что творится в COM где тоже интерфейсы интерфейсами погоняют, но нечто реализованное на C++?
Ведь если ком-класс реализует два разных интерфейса, что легально, то он неизбежно столкнётся с тем что в обоих интерфейсах надо реализовать AddRef/Release.
Естественно ожидать что нужно виртуальное наследование чтобы перекрыть одной и той же реализацией.
А нихрена подобного! В COM вообще нигде в базисе реализации на C++ не используется множественное наследование.
Опять таки кофе выпало изо рта - как так?
Так вот оказывается в C++ есть правило которое если я и знал, то забыл десятилетия назад - что если есть абсолютно одинаковый виртуальный метод в двух разных базах, то перекрывая его в производном классе ты автоматически перекрываешь обе реализации и иначе сделать невозможно!
И вот за счёт этого правила в COM без виртуального наследования работает поддержка множественных интерфейсов.
Прикольно.
Блин, я прям даже просветлел - я годами думал что механизм COM он какой то ну сложный - что под капотом там виртуальное наследование и какие то еще подкапотные механизмы.
А там нихрена - просто слоты для каждого интерфейса реализованного и всё. И в каждом слоте просто все интерфейсы отнаследованные повторяются если встречаются в любой другой ветке "грозди". И всё.
То что я придумывал на прошлой странице сложнее, но потому что и умеет сложнее.
Мда уж.
я бы не стал говорить, что COM, это что-то на крестах
com, это abi соглашение: https://ru.wikipedia.org/wiki/Microsoft_Component_Object_Model_Interface
"интерфейс бинарно работает вот так"
интерфейсы вполне себе реализуются и через Си, просто передавая указатель на рекорд, который состоит из указателей на функции
skalogryz
> com, это abi соглашение
Да, но реализовано оно вокруг того как MS VC++ делает раскладку объектов в памяти. Это не совпадение, а фича.
На самом деле даже неплохо получилось - переделка кода на Си совсем несложная.
А самый-самый COM язык - это, внезапно, Visual Basic 6. Там всё ООП - это автоматически COM.
Mikle
> А самый-самый COM язык - это, внезапно, Visual Basic 6. Там всё ООП - это автоматически COM.
Мне даже интересно - это MS Basic подгоняли под DCOM или DCOM подгоняли под MS Basic.
Насколько я подозреваю managed string BSTR в DCOM это сокращение от Basic string.
Что забавно - 1С пошла по тем же стопам и уже в 1С 7 все программные объекты то ли отображались то ли тоже реально являлись по сути своей COM-объектами, только не DCOM, а свой велосипед именуемый как то типа 1C Extensions - можно было из внешней программы залезть в программную среду 1С используя эти COM-интерфейсы и не только пользовать сами объекты, но и интегрироваться в среду.
Суть ровно та же - некий интерфейс а-ля IDispatch через который можно вызывать методы объекта упрощенно как Invoke(method_name, params_array, outputs_array);
Имбирная Ведьмочка
Он не тормоз ... Он медленный газ :)
Здравствуйте! Может кто делал представление на bitset, где в качестве смещения используются биты, а не байты
Интересует реализация методов merge/crop или union/intersect, не знаю как правильно их обозвать :D
Например: bitsetA(offset 0):merge( bitsetB(offset 3bit) )
SleepyHardbass
а что эти методы должны делать с битами то?
Вий
Вернуть новый bitset, где для каждого чанка/слова было выполнено ~сравнение~ битов
merge: bitsetA | bitsetB; crop: bitsetA & bitsetB
UPD:
Нашел реализацию на Go, может там будет понятнее bitset.go
UPD2:
Если никто подобными извращениями не занимался, то и не надо
Я сам что-нибудь придумаю (хотелось увидеть как это делают дргуие, т.е без лишних телодвижении в цикле - SHR(bits, offset), AND(bits, SHL(1, offset) - 1) и тому подобное
А чо std::is_arithmetic для bool, char, wchar_t, char8_t, char16_t, char32_t возвращает Ъ, он пьян?
nes
> А чо std::is_arithmetic для bool, char, wchar_t, char8_t, char16_t, char32_t возвращает Ъ, он пьян?
Потому что
template<class T> struct is_arithmetic : std::integral_constant<bool, std::is_integral<T>::value || std::is_floating_point<T>::value> {};
а про std::is_integral мы уже выясняли
https://gamedev.ru/flame/forum/?id=248221&page=19&m=5082367#m277
Приложение зависает при вызове exit, abort или terminate.
Как из кода уронить процесс, чтоб наверняка?
Отладчик говорит, что висит в ntdll!ZwWaitForMultipleObjects.
Dimich
гугл аяй модо:
тлдр: TerminateProcess(GetCurrentProcess(), 1)