home.social

#шаблони — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #шаблони, aggregated by home.social.

fetched live
  1. CW: Оголошення обмежень після класу/структури в C++

    У C++20 зʼявились концепти й обмеження для функцій, класів/структур та інших шаблонів. Для функцій та методів вимоги можна вказувати після оголошення шаблону або після функції.

    template<typename T>
        requires ...
    T f() {}
    
    template<typename T>
    T f() requires ... {}
    

    Якщо не шаблонний метод у шаблоні класу потребує додаткових вимог їх можна вказати після оголошення методу.

    template<typename T>
    class S {
        T f() requires integer<T> {}
    };
    

    У такому випадку клас може згенеруватись з будь-яким типом, але це метод буде присутній тільки якщо шаблонний тип відповідає вимогам.

    Але іноді може знадобитись використати поточний клас у вимогах. Наприклад при CRTP.

    template<typename D>
    class Base requires std::derived_from<D, Base> {...};
    

    На жаль зараз такого немає.

    #cpp #cxx #cpp20 #concepts #constrains #requires #class #template #struct #CRTP #proposal #програмування #шаблони #вимоги #обмеження #пропозиція

  2. CW: Явне оголошення this у :cpp_language: 23

    У C++ 23 додали можливість явно вказати обʼєкт класу над яким виконується метод в параметрах не статичних і невіртуальних методів.

    struct X {
        void foo(this X const& self, int i); // same as void foo(int i) const &;
    //  void foo(int i) const &; // Error: already declared
     
        void bar(this X self, int i); // pass object by value: makes a copy of “*this”
    };
    

    За допомоги цієї функціональності можна оновити використання CRTP.

    // a CRTP trait
    struct add_postfix_increment {
        template<typename Self>
        auto operator++(this Self&& self, int) {
            auto tmp = self; // Self deduces to "some_type"
            ++self;
            return tmp;
        }
    };
     
    struct some_type : add_postfix_increment {
        some_type& operator++() { ... }
    };
    

    Більше почитати про це можна тут:

    #cpp #cpp23 #explicit_this #crtp #this #self #template #шаблони #нововведення

  3. Ніяк не міг зрозуміти чому наступний код не компілюється.

    template <typename T, size_t N>
    struct Arr {
        T[N] arr;
    	
        T* begin() { return arr; }
        T* end()   { return arr + N; }
    };
    

    Хвилин пʼять сидів над ним якщо не довше.

    #cpp #arrey #class #struct #template #шаблони #масив #клас #структура #структури

Share on Mastodon

Enter the server where you have an account.