tgoop.com/cxx95/135
Create:
Last Update:
Last Update:
#jostik #compiler
Обзор жостиков C++ 0x00000002
)
Шаблоны C++ развиваются в сторону упрощения - многое было сделано, чтобы избавиться от enable_if
и ручной специализации шаблонов.
Одна из фичей - сейчас можно наложить trailing requires-clause на класс и на метод, чтобы ограничить их использование:
template<typename T>
requires std::copyable<T> && std::movable<T>
struct Blow {
void make_job()
requires (sizeof(T) > 100)
{ /* ... */ }
};
Логичным следующим шагом должно стать ограничение на поле класса.
Такое опциональное наличие поля было бы полезно везде, где из-за свойств шаблонной сущности меняется размер класса. Например делетеры в умных указателях (как
std::unique_ptr
). Или отсутствие поля "size", если он указан в шаблоне (как std::span
).Супер синтетический пример, как это должно работать у вектора, который на стеке или куче в зависимости от параметра:
template<typename T, std::size_t N = 0>
class JanusVector {
private:
// static vector, N is fixed
std::array<T, N> arr_ requires (N > 0);
// dynamic vector, N is not fixed
std::size_t size_ requires (N == 0);
T* data_ requires (N == 0);
};
// ...
int main() {
JanusVector<int, 228> vec1;
static_assert(sizeof(vec1) == 4 * 228);
JanusVector<int> vec2;
static_assert(sizeof(vec2) == 16);
}
Недавно мной была вкинута идея в разнорабочую группу по C++, пока без эффекта
Решил для прикола сделать реализацию этой фичи на Clang
(Ссылки: как настроить сетап для clang, как создать свой keyword)
Дифф за пару вечеров получился не очень большим (он на gist.github.com), состоит из таких кусков:
FieldDecl
, вычислять его значение в методе isRequiresClauseSatisfied
.Вот так можно делать proof of concept фичи
// типа поле `kek_` скомпилится если у него будет метод `foo()`
T kek_ requires requires { kek_.foo(); };
&Foo::kek
у нескомпилировавшегося поля kek
.В КОММЕНТАРИЯХ ЕЩЕ ТРИ ЖОСТИКА C++