Чуть-чуть из доклада 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 готова😁Но помните, что это работает только для литералов.
Прикона конечно, но кринж, что такие простые хотелки решаются вот такими методами. Может на раст уйду. Хз.
Или вообще кодить перестану.