ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Опциональные члены шаблонного класса по requires

Open Izaron opened this issue 1 year ago • 2 comments

<Описание вашей идеи> Уже есть возможность определять функцию для шаблонного класса, только если какое-то выражение удовлетворяет requires clause:

double get_sample() const
    requires requires (const T& t) { t.get_sample(); }
{
    return t.get_sample();
}

Нужно иметь возможность делать так же для членов класса, то есть иметь или не иметь данное поле согласно условию:

template<typename T>
class Sampler {
    // ...
private:
    double sample_ requires requires (const T& t) { t.get_sample(); };
    int kek_ requires std::integral<T>;
}

<Примеры, где ваша идея будет полезна. Чем больше примеров и чем большую аудиторию они охватывают - тем лучше> Везде, где из-за свойств шаблонной сущности меняется размер класса. Например делетеры в умных указателях (а-ля std::unique_ptr). Или отсутствие поля "size", если он указан в шаблоне (а-ля std::span).

Izaron avatar Apr 02 '24 18:04 Izaron

В догонку тогда и локальные переменные туда же.

int a requires requires{ sizeof(T) > 10 } = 10;

if constexpr(sizeof(T)>10) {
 std::count << a;
}

Члены класса можно решить сегодня через опциональное наследование. Не так изящно но решаемо.

NN--- avatar Oct 29 '24 21:10 NN---

Лучше бы runtime requires был-бы типа if но проверял переменную при её любых изменениях. int rc=0; assume (rc==0) else { return rc; } rc=fn1(args); rc=fn2(args); ...

kov-serg avatar Nov 01 '24 11:11 kov-serg