Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[98.80.143.34] |
|
Страницы: (78) « Первая ... 72 73 [74] 75 76 ... Последняя » ( Перейти к последнему сообщению ) |
Сообщ.
#1096
,
|
|
|
Ну так нормальные макросы(а не препроцессор) этим и должны заниматься. |
Сообщ.
#1097
,
|
|
|
О! Они наконец то выложили это!
https://youtu.be/6nsyX37nsRs |
Сообщ.
#1098
,
|
|
|
В
|
Сообщ.
#1099
,
|
|
|
Макросы в расте - примерно то же самое |
Сообщ.
#1100
,
|
|
|
Столкнулся с любопытным ограничением Стандарта. Нужно явно вызвать деструктор объекта, чей класс определён в области видимости пространства имён, отличного от текущего, и там же заtypedef-ен. Оказывается, без using этого достичь нельзя, что с моей точки зрения является дефектом Стандарта.
Конкретная задача возникла следующим образом. Потребовалось уметь создавать потоки ввода/вывода на файлах, открытыми кастомным образом посредством ОС API. Стандартных средств для этого пока нет, хотя потуги в направлении std::filesystem вроде бы наличествуют. На данный момент остаётся только пользоваться расширениями STL под конкретную платформу. Под WinAPI это к примеру некий подобный код: HANDLE file; FILE *fFile; std::filebuf inFile int handle; file = CreateFile(pat.second.c_str(), GENERIC_READ | FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) if (file == INVALID_HANDLE_VALUE) /* ... */ /* этот костыль нужен, т.к. создать inFile прям тут по месту невозможно: он нужен за пределами этой области видимости, поэтому создан ранее дефолтовым конструктором */ /* можно было бы – и нужно было бы – использовать std::filebuf::open() вместо конструктора, если бы он был, однако увы, расширение STL поддерживается только конструктором */ inFile.~filebuf(); // ошибка компиляции new(&inFile) std::filebuf(fFile = fdopen(handle = _open_osfhandle(reinterpret_cast<intptr_t>(file), _O_RDONLY), "rb")); Кто что думает по сему поводу? Дефект али нет? |
Сообщ.
#1101
,
|
|
|
Цитата Qraizer @ Нужно явно вызвать деструктор объекта, чей класс определён в области видимости пространства имён, отличного от текущего, и там же заtypedef-ен. Оказывается, без using этого достичь нельзя, что с моей точки зрения является дефектом Стандарта. Покажи плс синтетический вариант. По твоему куску кода непонятно. |
Сообщ.
#1102
,
|
|
|
Присоединяюсь к комментатору выше.
|
Сообщ.
#1103
,
|
|
|
А что тут непонятного? std он везде std, std::basic_filebuf<> вполне себе стандартен и везде одинаковый, его typedef basic_filebuf<char> filebuf; известен ещё в C++98. Ну нате.
namespace N { struct MyClass { ~MyClass() {} }; typedef MyClass A; } void f() { N::A a; a.~MyClass(); // имя находится, т.к. имена классов вносятся в их область видимости a.~A(); // имя не находится, т.к. при обработке операций . и -> (а также :: внутри скопа классов), компилятор наружу, в область видимости окаймляющего пространства имён, не выходит a.N::A::~A(); // был неправ, сразу не сообразил, но вот так достучаться можно... a.N::~A(); // ...а вот так нельзя } |
Сообщ.
#1104
,
|
|
|
Упрощенный вариант
struct MyClass {}; int main() { MyClass c; c.::~MyClass(); // почему не компилиться эта строчка? c.MyClass::~MyClass(); // а эта строчка норм return 0; } |
Сообщ.
#1105
,
|
|
|
А что если в Си добавить конструкцию, чтобы стали допустимы записи вида:
#defines A B C 42 ... P Q #enddef // или enddefs Это сократило бы исходники, и читать немножко легче стало бы... |
Сообщ.
#1106
,
|
|
|
Небольшой список вкусняшек из нового стандарта.
https://usingstdcpp.org/2018/03/18/jacksonv...impression=true |
Сообщ.
#1107
,
|
|
|
Цитата Славян @ А что если в Си добавить конструкцию, чтобы стали допустимы записи вида: Это настолько сахар для синтаксиса, что прямо ой. Плюс не забываем про многострочные макросы с переносом строки \ |
Сообщ.
#1108
,
|
|
|
Цитата Славян @ А что если в Си добавить конструкцию, чтобы стали допустимы записи вида: Цитата Mr.Delphist @ Кроме того, что это ничего нового не даёт, такая запись ещё и несколько сбивает с толку - получается кусок текста, который непонятно что означает (если не видно скобок) Это настолько сахар для синтаксиса, что прямо ой. |
Сообщ.
#1109
,
|
|
|
Цитата amk @ Многострочный комментарий обладает абсолютно таким же "изъяном", - однако, он существует и успешно используется! кусок текста, который непонятно что означает (если не видно скобок) Цитата amk @ Прямо ж написано!:это ничего нового не даёт Цитата Славян @ Это сократило бы исходники, и читать немножко легче стало бы... |
Сообщ.
#1110
,
|
|
|
Цитата Славян @ Ну если ты в комментариях бессмыслицу пишешь, то конечно.Многострочный комментарий обладает абсолютно таким же "изъяном", - однако, он существует и успешно используется! Цитата Славян @ Добавление двух дополнительных строк текста конечно же сильно сокращает исходники.Прямо ж написано!: У тебя что, каждая единица трансляции в чистом Си начинается с пары страниц макроопределений? Да и поздно уже такое изменение вносить. Вот в году 1970-м возможно его и приняли бы. |