TGViewer
this->notes. this->notes. @thisnotes · 4.52K subscribers
Post #214 2.01K
#cpp

Чуть-чуть из доклада Daisy Hollman (не путать с Nadin Holman) на CppCon 2022 (прошлый я упоминал тут).

Fun fact. Можно скрыть общий шаблон с помощью constraint’ов:

template <class T>
struct B {
void print() { cout << “unreachable”; }
};

template <> requires true
struct B<T> {
void print() { cout << “new default”; }
};


Теперь изначальный шаблон недостижим, потому что более частный с точки зрения компилятора предпочтителен, пусть семантически он ровно такой же.
По факту, вы можете полностью заменить определения каких-нибудь стандартных классов (на практике это вероятно уб, но теоретически да).

Правда если вы потом захотите сделать ещё одну специализацию:

template <class T> requires std::integral<T>
struct B<T> {
void print() { cout << “integral”; }
};


то для условного int получится неоднозначность, потому что по факту это выбор между двумя requires true. Но это можно обойти объявлением всегда истинного концепта:

template <class T> concept True = true;

И поменять сигнатуры на

template <class T> requires True<T>
// и
template <class T> requires std::integral<T> && True<T>


Это какие-то жоские преки. Словно про поломанность std::void_t вспомнил.

Второй fun fact (ну это конечно чуваки крутят-вертят как хотят уже).
Помним можно писать user-defined literal templates:

template <char… Chars>
constexpr auto operator “”_i();


И использовать их можно вот даже для чисел:

auto x = 123_i;

Компилятор распарсит 123 в три символа и внутри оператора можете творить что хотите.
Собственно на этом и построена возможность обращаться к элементу тупла через operator[]:

template <size_t I> struct index {};

// преобразовываем литерал в число
template <char… Chars>
constexpr auto operator “”_i () {
return index<[]{
size_t rv = 0;
for (auto c : {Chars…})

rv = rv * 10 + (c - ‘0’);
}()>{};
}


template <class… Ts>
struct index_tuple : std::tuple<Ts…> {
using std::tuple<Ts…>::tuple;

template <size_t I>
auto operator[](index<I>) {
return std::get<I>(*this);
}
};


auto t = index_tuple<int, double>{1, 2.2};
cout << t[1_i];


Ну и всё. Файная обёртка над std::get готова😁
Но помните, что это работает только для литералов.

Прикона конечно, но кринж, что такие простые хотелки решаются вот такими методами. Может на раст уйду. Хз.
Или вообще кодить перестану.
  • 👍 7
More from @thisnotes
  1. Sep 17, 2026#common Сидите вы себе спокойно, разрабатываете поиск каких-нибудь объектов. Может это тов…
  2. Sep 9, 2026#cpp #books Да, книга 2001ого года. Мы ровесники. И да, в ней в основном обсуждаются какие…
  3. Sep 2, 2026#perf Попробовал собрать в кучку (кажется, немного сумбурно всё же) мысли по двум моментам…
  4. Aug 31, 2026Давайте новый тег заведём: #perf Во-первых, надо понять, что я вообще понимаю под перфом,…
  5. Aug 27, 2026#common Мы часто делаем системы, которые обладают какими-то ограничениями. Ограничения наш…
  6. Aug 24, 2026#list 0. [talk] Achieving Peak Performance for Matrix Multiplication in C++. Aliaksei Sala…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →