Текущий Стандарт С++ и перспективы его развития
    
  ![]()  | 
Наши проекты:
 Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту  | 
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS | 
| [216.73.216.5] | 
 
 | 
		
  | 
| Страницы: (81) « Первая ... 72 73 [74] 75 76 ... 80 81 ( Перейти к последнему сообщению ) | 
    Текущий Стандарт С++ и перспективы его развития
    
  | 
         
         
         
          
           Сообщ.
           #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-м возможно его и приняли бы.  |